在消息成帧方案中,我想保护带有CRC错误检测的数据包。这些数据包通过TCP连接发送。
对于长度小于16字节的小数据包,我选择CRC8。对于小于4096字节的数据包,采用CRC16算法。对于较大的数据包CRC32算法。
由于硬件支持(至少在一些Intel CPU上),目前最有吸引力的CRC实现是CRC32C。但是没有针对8位和16位CRC的特殊说明。
我现在的问题是:是否可以将CRC32C算法的32位值减少到16位或8位值,与原生CRC16或CRC8算法相比,不会损害错误检测性能?
一个例子:
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;
fake_crc8和真正的CRC8实现一样好吗?
提前致谢。
答案 0 :(得分:3)
32位CRC的低8位不具有与8位CRC一样好的纠错特性,例如,检测突发错误的保证。但是,根据噪声源的特性,它可能适合您的应用。如果您的位置存在大量具有相关性的位错误,那么您应该使用真正的CRC。如果您有罕见的位翻转或大量严重错误,那么CRC的一部分可能也会起作用。
没有任何替代品可以测试它们的表现。