计算CRC-16(0xFFFF)

时间:2016-10-16 19:47:42

标签: c# crc16

我有18005个十六进制帧的数据,我想同时计算所有帧的crc-16(0xffff)然后追加。

1 个答案:

答案 0 :(得分:1)

您的CRC没有充分说明。您是否尝试与使用16位CRC的某些协议兼容?如果是这样,您需要找出该CRC的参数。你可以找到here a list of 28 different 16-bit CRC definitions。您需要的那个可能是其中之一,或者它可能是另一组参数。

“(0xffff)”在你的名字中意味着什么并不清楚。初始值?最后的独家或?空字符串的CRC?还有别的吗?

通过“同时”计算所有帧的CRC,不清楚你的意思。你为什么同时说?

附加CRC时,您还需要知道应该附加的位或字节顺序。一个双字节CRC可以以小端或大端顺序附加。

更新

根据评论中的示例CRC,所需的CRC-16为CRC-16/CCITT-FALSE from the RevEng catalog。您可以使用crcany生成计算此CRC的C代码。它将以不同的速度和复杂度生成逐位,逐字节和逐字的代码。生成的逐位例程是:

#include <stdint.h>

unsigned crc16ccitt_false_bit(unsigned crc, void const *data, size_t len) {
    if (data == NULL)
        return 0xffff;
    while (len--) {
        crc ^= (unsigned)(*(unsigned char const *)data++) << 8;
        for (unsigned k = 0; k < 8; k++)
            crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1;
    }
    crc &= 0xffff;
    return crc;
}

(当bufNULL时,返回初始CRC值。)

您可以通过检查从您的示例流中判断CRC是以小端还是大端顺序附加的。