我使用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();
}
java版
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版本返回long,即64bit,而c ++ / boost版本返回long为32bit。 java版本的crc32结果会溢出32位吗?
答案 0 :(得分: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接口。已指定此接口为getValue()方法返回long。这样做是为了允许校验和实现返回超过32个有用的信息位。