#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.