【问题标题】:Calculating checksum (16 bit) in c在c中计算校验和(16位)
【发布时间】:2021-04-18 00:40:09
【问题描述】:

我被要求对此文本进行校验和,位大小为 16: "AAAAAAAAAA\nX"

起初,描述似乎需要 Fletcher-16 校验和。但是弗莱彻对上述文本执行的校验和的输出产生了十六进制的 8aee。示例文件说模和算法(减去二进制补码)应该以十六进制输出 509d

唯一的其他信息是标准“每两个字符应添加到校验和。”

除了使用相应 Wikipedia 页面上提供的通用 Fletcher-16 校验和外,我还尝试使用此处找到的此解决方案:calculating-a-16-bit-checksum 无济于事。此代码生成了 4f27 的十六进制值。

【问题讨论】:

    标签: c checksum


    【解决方案1】:

    只需将数据视为一个大端 16 位整数数组即可生成结果509d

    #include <stdio.h>
    
    int main(void) {
        char data[] = "AAAAAAAAAA\nX";
        int sum = 0;
        int i;
        for(i = 0; data[i] != '\0' && data[i + 1] != '\0'; i += 2) {
            int value = ((unsigned char)data[i] << 8) | (unsigned char)data[i + 1];
            sum = (sum + value) & 0xffff;
        }
        printf("%04x\n", sum);
        return 0;
    }
    

    【讨论】:

    • 好的,我可以看到我现在误会的地方了。感谢您的快速回复。
    • 对于书呆子:使用unsigned char* 进行数据访问,否则data[i] != '\0'(2 个零)和(unsigned char)data[i] 对于恐龙非2 的补码机器不正确。 (unsigned char)data[i] &lt;&lt; 8 有 16 位 int 溢出的风险。最好将unsigned sum"%04x" 一起使用,以避免在32 位机器上sum &lt; 0 时输出8 位数字。
    • @chux-ReinstateMonica 为什么data[i] != '\0' 不正确?
    • 罕见的非 2 补码机器有 +0 和 -0 或 +0 和陷阱。在 C 中,字符串的最后一个 null 字符 只是 +0 之一。请参阅“对于本子条款中的所有函数,每个字符都应被解释为好像它具有 unsigned char 类型(因此每个可能的对象表示都是有效的并且具有不同的值)。” 7.24.1 3 访问data[i] != '\0'可以同时触发+0和-0。
    • @MikeCAT 我试图以同样的方式添加 32 位校验和,但似乎无法理解这个概念。我尝试增加 4 并尝试了各种 oring 组合。我还是会左移 8 位还是 16 位?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2018-10-23
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多