【问题标题】:What checksum is it and how does it work? [Checksum 32bit]它是什么校验和,它是如何工作的? [校验和 32 位]
【发布时间】:2021-09-01 07:34:39
【问题描述】:

我正在尝试在 WinHex 程序中实现校验和,在 WinHex 和 010 编辑器中调用它

校验和 Uint 32 位

例如我们计算32byte(以HEX表示)数据的校验和:

1122334455667788991122334455667711223344556677889911223344556677

WinHex 为我们提供了 checksum32 值:

EE65DE86

我在想这只是将每个字节与前一个字节相加:

    unsigned char checksum(unsigned char data[]){
        unsigned char sum = 0;
        int i;
        for(i=0; sizeof(data); i++){
            sum += data[i];
        }
        return -sum;
       }

我试过了,它给了我错误的校验和。显然不是 crc,可能是 Adler 或 Fletcher 或其他 smh,校验和变化太多,很难找到正确的一个

【问题讨论】:

  • 鉴于你的代码使用了unsigned关键字,我们可以推断你的[c#]标签是错误的吗?
  • @Llama 是的,抱歉,修复它
  • This (page 15) 说这只是所有字节的总和,但实际上我也没有得到那个结果。
  • 取模运算符,它返回除法的余数。
  • 它说的是“a 32 位校验和”,而不是“唯一的 32 位校验和”。 CRC32 也是“a 32 位校验和”

标签: c checksum


【解决方案1】:

函数似乎永远不会返回
这是一个无限循环,或者 粉碎
i 不断增加直到重叠
除了sizeof(data) 是4,data 是一个指针

unsigned char checksum(unsigned char data[]){
    unsigned char sum = 0;
    int i;
    for(i=0; sizeof(data); i++){ // equivalent for(i=0; 4; i++), for(i=0; true; i++)
        sum += data[i];
    }
    return -sum;
   }

我们还需要data 长度

unsigned char checksum(unsigned char data[], int data_length){  //<-- added data_length
    int sum = 0; // <-- int instead of unsigned char
    int i;
    for(i=0; i<data_length; i++){  //  as long as i is less than data_length
        sum += data[i];
    }
    return -sum;
   }

【讨论】:

    【解决方案2】:

    至少这个问题:

    sizeof(data)下面是指针的大小而不是0 --> 无限循环。

    unsigned char checksum(unsigned char data[]){
        unsigned char sum = 0;
        int i;
        for(i=0; sizeof(data); i++){
            sum += data[i];
        }
        return -sum;
       }
    

    函数只返回值 0-0xFF,从不返回 0xEE65DE86

    【讨论】:

      【解决方案3】:

      我找到了解决方案,感谢Gerhardh,我们需要将4bytes转换为int32然后总结

      unsigned int checksum( int  data[])
      {
          unsigned int sum = 0;
          int i;
          int size;
              
          for(i=0; sizeof(data); i++) {
              sum += data[i];
          }
          return sum;
      }
      

      【讨论】:

      • 贴出的代码是一个无限循环。即使固定,数据加起来也达不到 EE65DE86。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2015-06-29
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多