Будет ли переполнение Java CRC32 32-битным?

Я использую boost crc32 для симуляции Java-версии:

long HashUtils::CalcCRC32(const std::wstring& filePath)
{
HANDLE hFile = CreateFile(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
if (hFile == INVALID_HANDLE_VALUE)
return 0;
std::vector<byte> buff;
DWORD dwSize = GetFileSize(hFile, NULL);
buff.resize(dwSize);
boost::crc_32_type crc32;
DWORD bytesRead = 0;
if (!ReadFile(hFile, buff.data(), buff.size(), &bytesRead, 0) || bytesRead != dwSize) {
CloseHandle(hFile);
return 0;
}
CloseHandle(hFile);
crc32.process_block(buff.data(), buff.data() + buff.size());
return crc32.checksum();
}

Ява версия

private static long calcCRC32(byte[] raw, int offset, int len) throws IOException {
CRC32 crc32 = new CRC32();
crc32.update(raw, offset, len);
return crc32.getValue();
}

Проблема заключается в том, что версия Java возвращает длинную версию, которая составляет 64 бита, в то время как версия c ++ / boost возвращает длинную версию, которая составляет 32 бита. Будет ли результат crc32 переполнения 32-битной версии Java?

0

Решение

Класс java CRC32 возвращает только 32-битные CRC. Поэтому тип данных int достаточно велик, чтобы вместить всю информацию. Вы можете переписать свою функцию следующим образом:

private static int calcCRC32(byte[] raw, int offset, int len) throws IOException
{
CRC32 crc32 = new CRC32();
crc32.update(raw, offset, len);
return (int)crc32.getValue();
}

Теперь у вас должны быть похожие результаты для C ++ и Java-версии.

Кстати, причина того, что crc.getValue () возвращает long вместо int, довольно проста: CRC32 реализует интерфейс Checksum. Этот интерфейс был указан для возврата long для метода getValue (). Это было сделано, чтобы обеспечить реализацию контрольной суммы, которая возвращает более 32 полезных битов информации.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector