首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证CRC32校验和

验证CRC32校验和
EN

Stack Overflow用户
提问于 2020-07-29 01:17:19
回答 1查看 953关注 0票数 0

我能够成功地生成与预期输出相匹配的CRC32。但是,当我试图将带有校验和C(由CRC32函数生成)的消息M插入到同一个CRC32生成器中时,我无法获得预期的0x00000000输出。

我的CRC32生成器基本上就是这里的代码(https://lxp32.github.io/docs/a-simple-example-crc32-calculation/),带有一个用于校验和的附加函数参数,因为在我的示例中,消息和校验和在收到时位于不同的内存位置。

代码语言:javascript
复制
uint32_t crc32(const char* s, size_t n, uint32_t checksum) {
    uint32_t crc = 0xFFFFFFFF;
    size_t i; size_t j;

    for (i = 0; i < n; i++) {
        char ch = s[i];
        uint32_t t = (ch ^ crc) & 0xFF;
        crc = (crc >> 8) ^ crc32_table[t];
    }

    if (i & 1) { // if i ended odd, write a 0x00 pad bit
        uint32_t t = (0x00 ^ crc) & 0xFF;
        crc = (crc >> 8) ^ crc32_table[t];
    }

    // include checksum bits if not 0
    if (checksum) {
        for (j = 0; j < 4; j++) {
            char ch = (checksum & 0xFF);
            uint32_t t = (ch ^ crc) & 0xFF;
            crc = (crc >> 8) ^ crc32_table[t];
            checksum >>= 8;
        }
    }
    else {
        // append 32-bits of 0's
        for (j = 0; j < 4; j++) {
            uint32_t t = (0x00 ^ crc) & 0xFF;
            crc = (crc >> 8) ^ crc32_table[t];
        }
    }
    return ~crc;
}

bool validate_crc32(const char* msg, size_t n, uint32_t checksum) {
    uint32_t res = crc32(msg, n, checksum);
    return res == 0;
}

CRC32输入1: 0x61 0x62 0x63 0x64 0x00 0x00 0x00

CRC32输出1: 0x87988EF9

CRC32输入2: 0x61 0x62 0x63 0x64 0x87 0x98 0x8E 0xF9

CRC32输出2: 0x5D19F7CF

我觉得我在这里不明白什么.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-29 03:01:23

  1. ,如果你做得对,就不会得到零。每次都会得到相同的常数,但这个CRC值不是零。对于这个常量,常数是0x2144df1c。(它不是零,因为有最终的排他性或非零值。)

  1. ,你做得不对。首先,您不需要也不应该附加四个零。只需计算消息的CRC。第二,以小结尾的顺序追加CRC .不是大额订单。(因为这是一个向下移动的反映出来的CRC )
  2. ,用这种方式检查CRC没有什么意义。只需计算消息上的CRC,然后将结果与发送的CRC进行比较。对于阅读您的代码的人来说,这要容易得多,也更透明,并且避免了不必要的计算CRC的额外四个字节。这种比较比计算四个字节的CRC要快得多。
  3. 为什么要在其中为奇数长度的消息添加一个额外的零?
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63144948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档