Проверка контрольной суммы C ++ CRC32 - PullRequest
1 голос
/ 14 мая 2019

Я использую инструмент 7zip CHA32 для проверки моего алгоритма контрольной суммы 32.Алгоритм выдает правильное значение тогда и только тогда, когда размер буфера данных кратен 4. Если размер буфера отличается, алгоритм выдает правильную контрольную сумму, если я добавляю в буфер дополнительный байт '00'.Есть ли какие-нибудь общие алгоритмы C ++, которые могут работать без ограничений размера данных?спасибо

1 Ответ

0 голосов
/ 14 мая 2019

CRC-32 не требует дополнения ввода. Например, crc32("abc") и crc32("abc\0") будут иметь разные выходы.

Должна быть вторая функция или параметр, который по умолчанию равен 0 для начального значения хэша. Это используется для расширения хеша. crc32("cd", crc32("ab")) == crc32("abcd"). Так что просто добавьте последние несколько байтов.

В итоге вы получите что-то вроде этого:

std::uint32_t padded_crc32(const char* data, std::size_t size, std::uint32_t initial_value = 0) {
    const char padding[3] = {0, 0, 0};
    std::uint32_t unpadded_crc32 = crc32(data, size, initial_value);  // Or however you call it
    int padding_size = (4 - (size % 4)) % 4;
    return crc32(padding, padding_size, unpadded_crc32);
}
...