轻松理解CRC差错检测算法(A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS)六

本文详细介绍了CRC除法算法的基本原理及其实现过程。通过具体的步骤和示例,讲解了如何利用CRC除法进行数据校验,并给出了一个简单的实现算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8 一个直接的CRC实现


这里是理论部分的尾声。现在我们转向实现。一开始,着手一个绝对的从中间开始的枯燥的低速实现,它没有使用任何的提速技术。我们会逐步改善它,直到我们得到一个紧凑的表驱动实现的程序,这样的程序是我们都知道,都热爱的,而且我们中有些人想弄明白它。
为了实现CRC算法,我们要做的就是实现CRC除法。有2个原因来解释为什么我们不能简单地使用机器上的除法指令来做。首先是,我们做的是CRC除法。其次,余数会是将会是上兆字节长度,今天的处理器没有那么长的寄存器。
这样为了实现CRC除法,我们不得不把信息送入到一个除法寄存器中。到了这一步,我们必须绝对精确知道信息数据。下面的所有例子中,信息会被当成是一串字节流(每个字节8位)第7位是最高有效位。这些位形成的第一个字节,将会是以最高有效位的第一个字节开始,从第一个字节的0位到最后一个字节的第7位。有这样的前提,我们可以描绘出一个CRC算法除法的实现过程。在示例的前提,选择这样一个4位宽的poly,它是10111。然后,开始除法运算,我们要用到4字节的寄存器。
这里写图片描述

由以下步骤开始除法:

1. 把寄存器设置为全0.
2. 把信息附加W个0在尾部。
3. while(还有信息位){
4. 开始
5. 把寄存器向左移动一位,读取下一个位进入0位置。
6. 如果(在上一步从左侧出栈的是1个1){
7. 寄存器 = 寄存器XOR poly
8. }
9. }
10. 现在寄存器中的值就是余数
11.

(注:实事上,如果的判断可以通过在左移前,来检测寄存器的最高位达到目的)
我们可以叫这个是SIMPLE算法。
这可能看起来有点混乱,但是我们实际上我们在做的是从信息中“减”去多项式的各个倍数(也就是移位)[译注:这里作者用的是power,应该是倍数才对],直到除了余数再没有其他数字。如果你还不明白,去学习这个手工的长除法例子。
很明显,上述算法,适用于任何位宽W。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值