Embedded CRC:定位错误字节

Embedded CRC:定位错误字节,embedded,crc,redundancy,error-correction,error-detection,Embedded,Crc,Redundancy,Error Correction,Error Detection,假设某个CRC对一个多字节数据块进行了两次处理, 一次未更改,一次只有一个错误字节。你能找到有故障的字节吗 是否仅根据这两个代码定位?请注意,这并不意味着 错误的确切性质必须仅确定其位置,字节错误也不限于可通过任何CRC纠正的单位翻转。给定:CRC用于良好数据,CRC用于具有一个坏字节的数据。假设两个给定的CRC良好,因此CRC本身没有错误。将好数据CRC与坏数据CRC进行异或。考虑这是因为用坏数据+坏CRC XOLE好数据+好CRC,结果是除了一个坏字节之外的全零数据和相应的CRC。xor还取

假设某个CRC对一个多字节数据块进行了两次处理, 一次未更改,一次只有一个错误字节。你能找到有故障的字节吗 是否仅根据这两个代码定位?请注意,这并不意味着
错误的确切性质必须仅确定其位置,字节错误也不限于可通过任何CRC纠正的单位翻转。

给定:CRC用于良好数据,CRC用于具有一个坏字节的数据。假设两个给定的CRC良好,因此CRC本身没有错误。将好数据CRC与坏数据CRC进行异或。考虑这是因为用坏数据+坏CRC XOLE好数据+好CRC,结果是除了一个坏字节之外的全零数据和相应的CRC。xor还取消任何初始CRC值或CRC值的后补

为了能够检测坏字节的位置,CRC需要对字节位置和字节值的每个可能组合都是唯一的

我发现CRC32C多项式0x1edc6f41为1到190235字节的数据生成唯一的CRC。它在190236字节的数据时失败,因为除bfr[0]=0xfb或bfr[190235]=0x32之外的全零缓冲区都会产生相同的(非唯一的)CRC=0x364b1c30

在给定好crc和坏crc(一个坏字节)的情况下,确定位置的示例代码:

static uint32\u t crtbl[256];
void genrtbl(void)
{
uint32_t crc;
uint32_t b;
uint32_t c;
uint32_t i;
对于(c=0;c<0x100;c++){
crc=c;
对于(i=0;i<8;i++){
b=crc&1;
crc>>=1;
crc^=(0-b)和(0x11edc6f41>>1);
}
crtbl[c]=crc;
}
}
大小crc32r(uint32大小crc)
{
而(大小--){
crc=(crc>>8)^CRTBL[crc&0xff];
如果(0==(crc&0xffffff))
打破
}
返回(大小);
}
// ...
genrtbl();//生成表
//给定good_crc和bad_crc,返回位置
位置=crc32r(好crc^坏crc,大小);
生成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);
}
uint32\u t crctbl[256];
void gentbl(void)
{
uint32_t crc;
uint32_t b;
uint32_t c;
uint32_t i;
对于(c=0;c<0x100;c++){
crc=c31;

crc没有足够的信息。没有提到crc中的位数、crc多项式的循环周期和数据块中的字节数。我假设“完全基于两个代码”意味着“完全基于两个crc”,一个表示好数据,一个表示坏数据。如果问题的答案是肯定的,那么答案是否需要包括如何确定错误字节位置的过程?这是一般意义上的意思。是否存在提供此属性的任何大小的CRC构造?无需提出一个过程。对于某些应用程序,它简单地定位故障而不进行纠正可能会很有趣。您可以判断单位错误是在有效负载部分还是校验和(FCS)中部分,通过计算有效负载的校验和并将其与接收到的校验和进行比较。如果它们相同,则错误在有效负载部分,否则如果它们不同,则错误在校验和部分。如果您具有正确的CRC,根据定义,您知道原始数据是什么,因此您可以简单地进行比较。但是如果您知道事先知道数据是什么,一开始就不需要传输它。工作起来很有魅力。我想定位多个错误字节是一个非常重要的扩展?@qantik-通过反向循环CRC,直到获得大量零位,这就是示例代码所做的。这对多个错误字节不起作用字节或多个坏突发,甚至多个坏位。对于多个坏位,这是一个试错过程,从全零开始,在每个可能的位置组合中尝试2个坏位,看看它是否匹配CRC,然后是3位,然后是4位,…。@qantik-要处理多个位置,通常是像BCH码这样的纠错码(用于位)或RS码(用于字节或其他固定数量的位元素)。@qantik-我忘了提到我对所有190235 x 255可能的组合进行了强力检查,以验证上面显示的代码是否有效。
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);
}