CRC:找到错误的字节



假定某些CRC两次处理多字节数据块一旦没有变化,就有一个有故障的字节。有故障的字节吗仅基于两个代码?请注意,这并不意味着错误的确切性质必须仅确定其位置,字节误差也不仅限于单个位flip。

给定:良好数据的CRC和一个不良字节的数据的CRC。假定给定的两个CRC是好的,因此CRC本身没有错误。用不良数据CRC XOR良好的数据CRC。将其视为使用不良数据 不良CRC的良好数据 好的CRC的X X,其结果是除一个不良字节和相应的CRC外,所有零是零。XOR还取消了CRC值的任何初始CRC值或补充后。

为了能够检测不良字节的位置,对于字节位置和字节值的每种可能组合,CRC都必须是唯一的。

我发现CRC32C多项式0x1EDC6F41为1至190235字节的数据产生独特的CRC。它在190236字节的数据中失败,除了BFR [0] = 0xFB或BFR [190235] = 0x32都产生相同的(非唯一(CRC =0x364B1C30。

示例代码确定给定的位置给定的CRC和坏CRC(一个不良字节(:

static uint32_t crcrtbl[256];
void genrtbl(void)
{
uint32_t crc;
uint32_t b;
uint32_t c;
uint32_t i;
    for(c = 0; c < 0x100; c++){
        crc = c;
        for(i = 0; i < 8; i++){
            b = crc&1;
            crc >>= 1;
            crc ^= (0 - b) & (0x11edc6f41>>1);
        }
        crcrtbl[c] = crc;
    }
}
size_t crc32r(uint32_t crc, size_t size)
{
    while(size--){
        crc = (crc >> 8) ^ crcrtbl[crc & 0xff];
        if(0 == (crc & 0xffffff))
            break;
    }
    return(size);
}
// ...
genrtbl();  // generate table
// given good_crc and bad_crc, return location
location = crc32r(good_crc ^ bad_crc, size);

代码生成CRC

uint32_t crctbl[256];
void gentbl(void)
{
uint32_t crc;
uint32_t b;
uint32_t c;
uint32_t i;
    for(c = 0; c < 0x100; c++){
        crc = c<<24;
        for(i = 0; i < 8; i++){
            b = crc>>31;
            crc <<= 1;
            crc ^= (0 - b) & 0x1edc6f41;   // 32 bit crc
        }
        crctbl[c] = crc;
    }
}
uint32_t crc32(uint32_t crc32, uint8_t * bfr, size_t size)
{
uint32_t crc = crc32;
    while(size--)
        crc = (crc << 8) ^ crctbl[(crc >> 24)^*bfr++];
    return(crc);
}

相关内容

  • 没有找到相关文章

最新更新