它是什么校验和,它是如何工作的? [校验和 32 位]

What checksum is it and how does it work? [Checksum 32bit]

我正在尝试通过 WinHex 程序实现校验和,在 WinHex 和 010 编辑器中它被称为

Checksum Uint 32bit

例如我们计算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 其他,它的校验和变化如此之多以至于很难找到正确的

至少这个问题:

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;
   }

仅功能 returns 值 0-0xFF,从不为 0xEE65DE86

我找到了解决方案,感谢 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;
}

函数好像从来没有returns
这是一个无限循环,或者 crush
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;
   }