Error handling 将CRC附加到末尾的缓冲区的CRC始终为0,这是否总是正确的?
假设的例子。。。 将CRC附加到末尾的缓冲区的CRC始终为0,这是否总是正确的Error handling 将CRC附加到末尾的缓冲区的CRC始终为0,这是否总是正确的?,error-handling,crc,crc16,lfsr,Error Handling,Crc,Crc16,Lfsr,假设的例子。。。 将CRC附加到末尾的缓冲区的CRC始终为0,这是否总是正确的 extern uint16_t CRC16(uint_8* buffer, uint16_t size); // From your favorite library void main() { uint16_t crc; uint8_t buffer[10] = {1,2,3,4,5,6,7,8}; crc = CRC16(buffer,8); buffer[8]= crc>
extern uint16_t CRC16(uint_8* buffer, uint16_t size); // From your favorite library
void main() {
uint16_t crc;
uint8_t buffer[10] = {1,2,3,4,5,6,7,8};
crc = CRC16(buffer,8);
buffer[8]= crc>>8; // This may be endian-dependent code
buffer[9]= crc & 0xff; // Ibid.
if (CRC16(buffer,10) != 0)
printf("Should this ever happen???\n");
else
printf("It never happens!\n");
}
如果在计算CRC后对其进行修改,例如某些CRC在生成CRC后对其进行后补,则使用数据+附加CRC生成新的CRC将产生非零但恒定的值。如果未对CRC进行后期修改,则结果将为零,无论CRC在生成之前是初始化为零还是非零值。如果CRC在计算后进行了修改,例如一些CRC在生成后对CRC进行后期补充,然后,使用数据+附加的CRC生成新的CRC将得到一个非零但恒定的值。如果未对CRC进行后期修改,则结果将为零,无论CRC在生成之前是初始化为零还是非零值 将CRC附加到末尾的缓冲区的CRC始终为0,这是否总是正确的 取决于CRC及其附加方式。对于网络(以太网,V42..)中使用的16位和32位CRC“CCITT”,否:最终CRC(按指定顺序追加)是常数,但不是零:
47 0F
对于16位CRC,对于32位CRC,1C DF 44 21
。16位示例
-------- message -------- CRC-CCITT-16
01 02 03 04 05 06 07 08 D4 6D
01 02 03 04 05 06 07 08 D4 6D 47 0F
DE AD BE EF CB E5
DE AD BE EF CB E5 47 0F
这在电信中很方便,处理接收的层通常知道帧只有在接收到CRC后才结束,而CRC已经输入到硬件检查CRC中
根本原因是8字节消息m0 m1…m6 m7
的16位CRC被定义为生成多项式的/m0/m1 m2 m3…m6 m7 FF
序列的剩余部分。当我们计算原始CRC
r0 r1
后的消息的CRC时,新的CRC因此是序列/m0/m1 m2 m3…m6m7 r0 r1 FF FF FF
的剩余部分通过生成多项式,因此是序列FF FF FF FF FF
的剩余部分,因此是常数,但没有理由为零
。包括16位和32位,“手动”并使用外部库,包括常数为零的库
对于附加的位数不正确或输出的CRC endian不正确的CRC(这些变体很多),结果取决于消息。这是一个肯定的迹象,表明出了问题,而且
- 接收方不能再将消息的CRC输入CRC检查器,并将结果与常数进行比较,以检查消息的完整性
- 它失去了CRC的理想特性,即捕捉到集中在不长于CRC的位序列上的任何错误(如果我们不直接获取CRC,则与消息结尾重叠的错误和CRC有时可能未被检测到)
47 0F
对于16位CRC,对于32位CRC,1C DF 44 21
。16位示例
-------- message -------- CRC-CCITT-16
01 02 03 04 05 06 07 08 D4 6D
01 02 03 04 05 06 07 08 D4 6D 47 0F
DE AD BE EF CB E5
DE AD BE EF CB E5 47 0F
这在电信中很方便,处理接收的层通常知道帧只有在接收到CRC后才结束,而CRC已经输入到硬件检查CRC中
根本原因是8字节消息m0 m1…m6 m7
的16位CRC被定义为生成多项式的/m0/m1 m2 m3…m6 m7 FF
序列的剩余部分。当我们计算原始CRC
r0 r1
后的消息的CRC时,新的CRC因此是序列/m0/m1 m2 m3…m6m7 r0 r1 FF FF FF
的剩余部分通过生成多项式,因此是序列FF FF FF FF FF
的剩余部分,因此是常数,但没有理由为零
。包括16位和32位,“手动”并使用外部库,包括常数为零的库
对于附加的位数不正确或输出的CRC endian不正确的CRC(这些变体很多),结果取决于消息。这是一个肯定的迹象,表明出了问题,而且
- 接收方不能再将消息的CRC输入CRC检查器,并将结果与常数进行比较,以检查消息的完整性
- 它失去了CRC的理想特性,即捕捉到集中在不长于CRC的位序列上的任何错误(如果我们不直接获取CRC,则与消息结尾重叠的错误和CRC有时可能未被检测到)