Error handling 将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>

假设的例子。。。 将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>>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有时可能未被检测到)
将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有时可能未被检测到)