在处理以下PDF时,中有一个示例
第4节:CRC-16代码和示例
(第95或91页(,它显示了CRC16值为133 (LSB)
和24 (MSB)
的串行数据包。
然而,我尝试过不同的计算器,例如:
- Lammert
- 精心设计的计算器
- CRC计算
但无论我使用的字节组合如何,我都无法获得PDF指示的CRC16值。
如何正确计算示例中的CRC16,最好使用这些计算器之一?(否则,C/C++代码应该可以工作(。
谢谢。
此特定CRC为CRC-16/ARC。crcany为这个CRC生成代码,其中包括这个简单的逐位例程:
#include <stddef.h>
#include <stdint.h>
uint16_t crc16arc_bit(uint16_t crc, void const *mem, size_t len) {
unsigned char const *data = mem;
if (data == NULL)
return 0;
for (size_t i = 0; i < len; i++) {
crc ^= data[i];
for (unsigned k = 0; k < 8; k++) {
crc = crc & 1 ? (crc >> 1) ^ 0xa001 : crc >> 1;
}
}
return crc;
}
标准接口是执行crc = crc16arc_bit(0, NULL, 0);
以获得初始值(在这种情况下为零(,然后使用消息的连续部分执行crc = crc16arc_bit(crc, data, len);
以计算CRC。
如果对附录中的九字节消息{1, 2, 1, 0, 17, 3, 'M', 'O', 'C'}
执行此操作,则返回的CRC为0x1885
,它的最低有效字节133
为十进制,最高有效字节24
为十进制。
crcany还生成了更快的表驱动例程。
如果你把01 02 01 00 11 03 4d 4f 43
作为十六进制给Lammert-Bies的计算器,第一个被称为";CRC-16";得到CCD_ 10。
如果将0102010011034d4f43
赋给crccalc.com并点击Calc-CRC16,则第二行为CRC-16/ARC,结果为0x1885
。