【问题标题】:Diffrent result for CRC32 in c++ and javac++和java中CRC32的不同结果
【发布时间】:2014-09-18 21:24:29
【问题描述】:

我正在尝试用 C++ 计算 CRC32 校验和。但我仍然得到不好的结果。

C++ 代码:

class CRC32
{

public:

    CRC32() {
        unsigned int poly = 0xedb88320;
        unsigned int temp = 0;
        for(unsigned int i = 0; i < 256; ++i) {
            temp = i;
            for(int j = 8; j > 0; --j) {
                if((temp & 1) == 1) {
                    temp = (unsigned int)((temp >> 1) ^ poly);
                }else {
                    temp >>= 1;
                }
            }
            table[i] = temp;
        }
    }

    unsigned int ComputeChecksum(byte* bytes,size_t size) {
        unsigned int crc = 0xffffffff;
        for(int i = 0; i < size; ++i) {
            byte index = (byte)(((crc) & 0xff) ^ bytes[i]);
            crc = (unsigned int)((crc >> 8) ^ table[index]);
        }
        return ~crc;
    }

private:
    unsigned int table[256];
};

这个java代码工作正常:

private int stmCrc32(byte abyte0[])
    {
        CRC32 crc32 = new CRC32();
        crc32.update(abyte0);
        return (int)(-1L ^ crc32.getValue());
    }

这是示例数据的十六进制字符串(结果应为 1909660290):

00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01:00:12:00:59:57:52:74:61:57:34:36:59:57:52:74:61:57:34:3d:0d:0a:00:00

【问题讨论】:

  • 无法重现.. 上面的代码对于 C++ 是正确的并且可以工作.. 如果你去:tools4noobs.com/online_php_functions/crc32 并输入:0000000000000000000000000000000000000000010012005957527461573436595752746157343d0d0a0000 它会打印:5be919e6 这是相同的如:ideone.com/dIKU38
  • 你为什么要这样做? (int)(-1L ^ crc32.getValue()).
  • @KonradRudolph 否则结果为负数
  • @Brandon Ok c++ 代码是正确的。但是它给出了不同的结果然后是java代码(c - 1542003174,java 1909660290),并且在可能的情况下java代码结果是正确的,那么如何让它工作呢?
  • @user3599093 就这样吧。这不是问题。你正在改变结果,当然它与 C++ 的结果不同——你期望什么?!

标签: java c++ c checksum crc32


【解决方案1】:

这两个实现看起来是相同的。您只是错过了周围的代码。在 C++ 中,完全按照他们在 Java 中所做的操作(尽管这可能很愚蠢),结果将是相同的。

byte data[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x59, 0x57, 0x52, 0x74, 0x61, 0x57, 0x34, 0x36, 0x59, 0x57, 0x52, 0x74, 0x61, 0x57, 0x34, 0x3d, 0x0d, 0x0a, 0x00, 0x00};
CRC32 crc;
int result = (int)(-1L ^ crc.ComputeChecksum(data, sizeof(data)));
std::cout << result << std::endl;

结果:1​​909660290

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 2021-12-25
    • 2015-03-18
    • 2011-03-13
    • 2020-11-13
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多