crc16的c语言函数 计算ccitt_计算CRC16校验和的函数

本文详细探讨了CRC(循环冗余校验)算法在不同实现中的差异,包括初始值的选择、数据位处理顺序以及CRC位的反转。通过举例说明如何调整CRC函数以匹配特定的CRC16算法(0x8005),并提供了相应的代码实现。当输入数据为'123456789'时,该函数返回的CRC值为0xbb3d。
摘要由CSDN通过智能技术生成

有几个细节需要与特定的CRC实现“匹配” – 即使使用相同的多项式,也可能会有不同的结果,这是因为数据位处理方式的细微差异,使用CRC的特定初始值(有时是零,有时为0xffff),和/或反转CRC的位。 例如,有时一个实现可以从数据字节的低位开始工作,而有时他们将从高位开始工作(如您现在所做的那样)。

而且,在运行所有数据位后,您需要“推出”CRC的最后一位。

请记住,CRCalgorithm是devise用硬件来实现的,所以从软件的angular度来看,一些位sorting的处理方式可能并不那么有意义。

如果要按照lammertbies.nl CRC计算器页面上显示的多项式0x8005匹配CRC16,则需要对CRCfunction进行以下更改:

a)通过CRC循环从最低有效位而不是从最高有效位开始运行数据位

b)在完成input数据后,将CRC的最后16位推出CRC寄存器

c)反转CRC位(我猜这个位是硬件执行的结果)

所以,你的function可能如下所示:

#define CRC16 0x8005 uint16_t gen_crc16(const uint8_t *data, uint16_t size) { uint16_t out = 0; int bits_read = 0, bit_flag; /* Sanity check: */ if(data == NULL) return 0; while(size > 0) { bit_flag = out >> 15; /* Get next bit: */ out <<= 1; out |= (*data >> bits_read) & 1; // item a) work from the least significant bits /* Increment bit counter: */ bits_read++; if(bits_read > 7) { bits_read = 0; data++; size--; } /* Cycle check: */ if(bit_flag) out ^= CRC16; } // item b) "push out" the last 16 bits int i; for (i = 0; i < 16; ++i) { bit_flag = out >> 15; out <<= 1; if(bit_flag) out ^= CRC16; } // item c) reverse the bits uint16_t crc = 0; i = 0x8000; int j = 0x0001; for (; i != 0; i >>=1, j <<= 1) { if (i & out) crc |= j; } return crc; }

当我传入"123456789"时,该函数为我返回0xbb3d 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值