将 CRC32 值减少到 16 或 8 位

Mar*_*rau 3 crc

在消息成帧方案中,我想通过 CRC 错误检测来保护数据包。这些数据包通过 TCP 连接发送。

对于长度小于16字节的小数据包,我会选择CRC8。对于小于 4096 字节的数据包,采用 CRC16 算法。对于较大的数据包,使用 CRC32 算法。

由于硬件支持(至少在某些 Intel CPU 上),目前最有吸引力的 CRC 实现是 CRC32C。但对于 8 位和 16 位 CRC 没有特殊说明。

我现在的问题是:与本机 CRC16 或 CRC8 算法相比,是否可以将 CRC32C 算法的 32 位值减少到 16 或 8 位值,而不损害错误检测性能?

一个例子:

char buffer[256];
...
uint32_t crc32 = compute_crc32c_of_block( buffer, 256 );
uint16_t fake_crc16 = ( crc32 >> 16 ) ^ crc32;
uint8_t fake_crc8 = ( fake_crc16 >> 8 ) ^ fake_crc16;
Run Code Online (Sandbox Code Playgroud)

fake_crc8 与真正的 CRC8 实现一样好吗?

提前致谢。

Mar*_*ler 5

32 位CRC 的低8 位不会具有与8 位CRC 一样好的纠错特性,例如保证检测突发错误。然而,它可能足以满足您的应用,具体取决于噪声源的特性。如果您有大量位错误且其位置相关,那么您应该使用真正的 CRC。如果您有罕见的位翻转或大量严重错误,那么 CRC 的一部分可能也能正常工作。

没有什么可以替代测试来了解它们的性能。