导航:首页 > 源码编译 > crc算法的实现c语言

crc算法的实现c语言

发布时间:2025-04-23 04:35:13

‘壹’ CRC-16 计算方法及程序设计

CRC-16算法是一种用于数据传输错误检测的常用校验技术,它基于16位的二进制寄存器对数据帧中的每个字节进行异或运算和位移操作。发送设备在数据帧尾部添加生成的CRC值,接收端则重新计算并与接收到的值对比,确认数据完整无误。具体步骤如下:

1. 初始化16位CRC寄存器为全1(0xFFFFH)。
2. 对数据帧的第一个字节的8位进行异或操作,将结果存回寄存器。
3. 移位操作:将寄存器右移一位,高位补0,低位丢弃并检测。
4. 若低位为1,则寄存器与预设值0xA001进行异或;否则,仅做右移。
5. 重复步骤3和4,直至完成8次移位,处理一个完整的8位字节。
6. 对下一个字节重复此过程,直至处理完所有字节。
7. CRC寄存器的最终值即为CRC校验值。

以示例数据0x03 0x10 0x00 0x01 0x00 0x08为例,通过C语言实现的CRC-16计算过程展示了这个过程。在VHDL语言中,也有类似的进程来接收数据并进行CRC校验,涉及状态机和逻辑运算,确保数据的正确传输和接收。

‘贰’ crc16校验的c语言程序

下面我们以CRC-16为例来说明任意长度数据流的CRC校验码生成过程。我们采用将数据流分成若干个8bit字符,并由低字节到高字节传送的并行方法来求CRC校验码。具体计算过程为:用一个16bit的寄存器来存放CRC校验值,且设定其初值为0x0000;将数据流的第一个8bit与16bit的CRC寄存器的高字节相异或,并将结果存入CRC寄存器高字节;CRC寄存器左移一位,最低1bit补零,同时检查移出的最高1bit,若移出的最高1bit为0,则继续按上述过程左移,若最高1bit为1,则将CRC寄存器中的值与生成多项式码相异或,结果存入CRC寄存器值;继续左移并重复上述处理方法,直到将8bit数据处理完为止,则此时CRC寄存器中的值就是第一个8bit数据对应的CRC校验码;然后将此时CRC寄存器的值作为初值,用同样的处理方法重复上述步骤来处理下一个8bit数据流,直到将所有的8bit字符都处理完后,此刻CRC寄存器中的值即为整个数据流对应的CRC校验码。
下面示出了其计算过程的流程图:

在用C语言编写CRC校验码的实现程序时我们应该注意,生成多项式 对应的十六进制数为0x18005,由于CRC寄存器左移过程中,移出的最高位为1时与 相异或,所以与16bit的CRC寄存器对应的生成多项式的十六进制数可用0x8005表示。下面给出并行处理8bit数据流的C源程序:
unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg为crc寄存器, data_crc为将要处理的8bit数据流
{
unsigned short msb; //crc寄存器将移出的最高1bit
unsigned short data;
unsigned short gx = 0x8005, i = 0; //i为左移次数, gx为生成多项式

data = (unsigned short)data_crc;
data = data << 8;
reg = reg ^ data;
do
{
msb = reg & 0x8000;
reg = reg << 1;
if(msb == 0x8000)
{
reg = reg ^ gx;
}
i++;
}
while(i < 8);
return (reg);
}
以上为处理每一个8bit数据流的子程序,在计算整个数据流的CRC校验码时,我们只需将CRC_reg的初值置为0x0000,求第一个8bit的CRC值,之后,即可将上次求得的CRC值和本次将要处理的8bit数据作为函数实参传递给上述子程序的形参进行处理即可,最终返回的reg值便是我们所想得到的整个数据流的CRC校验值。

阅读全文

与crc算法的实现c语言相关的资料

热点内容
微信文件夹为什么会被锁定 浏览:994
加密系列号 浏览:458
电冰箱换压缩机要注意什么 浏览:795
平板的访客模式如何加密 浏览:139
钉钉加密有用吗 浏览:112
加密u盘好还是不加密的 浏览:349
微观经济学平狄克第八版pdf 浏览:404
linux查看实时流量 浏览:557
如何存档到服务器 浏览:548
flash编程书籍推荐 浏览:836
php获得数组键值 浏览:402
香港云服务器操作 浏览:303
wpe最新源码 浏览:857
自己购买云主服务器推荐 浏览:422
个人所得税java 浏览:761
多余的服务器滑道还有什么用 浏览:192
pdf劈开合并 浏览:29
不能修改的pdf 浏览:752
同城公众源码 浏览:489
一个服务器2个端口怎么映射 浏览:298