CRC32 - 更改初始值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CRC32 - 更改初始值相关的知识,希望对你有一定的参考价值。

我想用Java中的初始CRC值计算字节数组的CRC32值,与此Python脚本中的相同:

import zlib

def getCrc32():
    with open("test.py", mode='rb') as file:
        fileContent = file.read()
        crcVal = zlib.crc32(fileContent,10)

if __name__ == "__main__":
    getCrc32()

但在Java中,我无法通过以下代码获得相同的结果:

RandomAccessFile f = new RandomAccessFile("test.py", "r");
byte[] b = new byte[(int) f.length()];
f.readFully(b);
CRC32 c2 = new CRC32();
c2.update(10);
c2.update(b);
System.out.println((int) c2.getValue());

如何用Java中的初始值计算CRC32?

答案

你不能,至少不是直接的。 Java class不提供设置当前CRC值的方法。 (reset()方法应该为此辩护,但唉,它没有。)

然而,可以导出将CRC设置为给出期望值的四个消息字节。您可以使用这四个字节执行reset()然后使用update()将CRC设置为您想要的值。 spoof code可以为你做到这一点。

欺骗对此有点过分,但您可以从该代码中获得所需的内容。真正需要的只是Ax + b,其中A是一个常数32x32位矩阵,x是所需的CRC,b是32位常数,结果是32位(四个字节)要输入以获得期望的CRC。矩阵乘法和向量加法以模2进行,其中异或替换加法,并且运算符替换乘法。

另一答案

你有没有尝试过使用Reflection来设置CRC32实例的crc字段?这对我行得通。

String input = "Hello World!";
    String input2 = "I love you!";
    CRC32 crc = new CRC32();
    crc.update(input.getBytes());
    System.out.println("input: " + input);
    System.out.println("crc: " + crc.getValue());

    CRC32 crc2 = new CRC32();
    System.out.println("crc2: " + crc2.getValue());

    try {
        Field crcField = CRC32.class.getDeclaredField("crc");
        final boolean accessible = crcField.isAccessible();
        System.out.println("crc2 original accessible: " + accessible);
        crcField.setAccessible(true);
        System.out.println("crc2 accessible is set to " + crcField.isAccessible());
        System.out.println("crc2 about to do reflection...");
        crcField.setInt(crc2, (int) crc.getValue());
        System.out.println("crc2 reflection is done.");
        System.out.println("crc2: " + crc2.getValue());
        System.out.println("crc2 current crc accessible: " + crcField.isAccessible());
        System.out.println("crc2 accessible is being restored to " + accessible);
        crcField.setAccessible(accessible);
        System.out.println("crc2 current crc accessible: " + crcField.isAccessible());
    } catch (Throwable e) {
        e.printStackTrace();
    }

    System.out.println("input2: " + input2);
    crc2.update(input2.getBytes());
    System.out.println("crc2: " + crc2.getValue());

    CRC32 crc3 = new CRC32();
    String wholeInput = input + input2;
    System.out.println("input + input2: " + wholeInput);
    crc3.update((wholeInput).getBytes());
    System.out.println("crc3: " + crc3.getValue());

以上是关于CRC32 - 更改初始值的主要内容,如果未能解决你的问题,请参考以下文章

谁会crc16-ccitt的计算方法,用winform做的,谢谢啦。。。

计算CRC校验值(CRC16和CRC32)(网络传输检验)

将 CRC 值保存在文件中,而不更改实际的 CRC 校验和?

如何计算 string 的 crc32 值 ?

STM32大文件分块校验CRC

Python中的CRC32计算而不使用库