CRC-16计算

问题描述 投票:1回答:1

[我在CRC-16中有大量数据和相关的校验和,但我找不到正确的方法来计算此数据的校验和,并且与已有的CRC相同。

这是我的数据:

01 EF F7 FE EF FF FD EF FB FA FD A2 AA 21

与此数据关联的计算出的CRC-16:

01 F4

以及用于计算的多项式值:

84 08

然而,尽管我做了所有尝试,但我仍然找不到从我发布的数据计算上述校验和(01F4)的方法。

checksum crc crc16
1个回答
0
投票

假设CRC右移,您可以通过将初始crc值更改为0x9786来强制匹配,但没有其他示例,目前尚不清楚这是否是正确的解决方案。示例代码,基于我在系统上搜索CRC初始值时使用的旧代码:

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;

uint16_t crctbl[256];

void gentblr()
{
uint16_t crc;
uint16_t b;
uint16_t c;
uint16_t i;
    for(c = 0; c < 0x100; c++){
        crc = c;
        for(i = 0; i < 8; i++){
            b = crc&1;
            crc >>= 1;
            crc ^= (0-b)&0x8408;  /* assumes two's complment math */
        }
        crctbl[c] = crc;
    }
}

uint16_t crc16r(uint16_t crc, uint8_t * bfr, size_t size)
{
    while(size--)
        crc = (crc >> 8) ^ crctbl[(crc & 0xff)^*bfr++];
    return crc ;
}

int main()
{
uint8_t data[]= {0x01,0xEF,0xF7,0xFE,0xEF,0xFF,0xFD,0xEF,0xFB,0xFA,0xFD,0xA2,0xAA,0x21};
uint16_t crcin, crc;
    gentblr();
    crcin = 0;
    do {
        crc = crc16r(crcin, data, sizeof(data));
        if (crc == 0x01f4)
            break;
    } while (0 != ++crcin);
    printf("%04x\n", crcin);
    return 0;
}

输出是

0x9786
© www.soinside.com 2019 - 2024. All rights reserved.