java CRC32结果会溢出32位吗?

时间:2014-08-14 11:12:53

标签: java c++ crc32

我使用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位吗?

1 个答案:

答案 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个有用的信息位。