Что это за контрольная сумма и как она работает? [Контрольная сумма 32 бита]

#c #checksum

Вопрос:

Я пытаюсь реализовать контрольную сумму из программы WinHex, в WinHex и в редакторе 010 она называется

Контрольная сумма Uint 32 бит

Например, мы вычисляем контрольную сумму 32-байтных (представленных в шестнадцатеричном формате) данных:

1122334455667788991122334455667711223344556677889911223344556677

WinHex дает нам значение контрольной суммы32:

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, может быть, это Адлер, Флетчер или что-то еще, это так много вариантов контрольных сумм, что довольно сложно найти правильный

Комментарии:

1. Учитывая, что в вашем коде используется unsigned ключевое слово, можем ли мы сделать вывод, что ваш [c#] тег неверен?

2. @Лама да, извини, черт возьми

3. Это (страница 15) говорит, что это просто сумма всех байтов, но на практике я тоже не получаю такого результата.

4. Оператор по модулю возвращает остаток от деления.

5. Там написано » 32-разрядная контрольная сумма», а не » единственная 32-разрядная контрольная сумма». CRC32 также является » 32-разрядной контрольной суммой».


Ответ №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:

Я нашел решение, благодаря Герхарду, нам нужно преобразовать 4 байта в 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;
}
 

Комментарии:

1. Опубликованный код представляет собой бесконечный цикл. Даже исправленные данные не складываются в EE65DE86.