2016-08-16 2 views
0

Я хочу, чтобы вычислить значение CRC32 из массива байтов с начальным значением CRC в Java, такой же, как в сценарии Python:CRC32 - изменить начальное значение

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()); 

Как вычислить CRC32 с фактическим значением в Java?

ответ

1

Вы не можете, по крайней мере, не напрямую. Java class не предоставляет средства для установки текущего значения CRC. (Метод reset() должен принять для этого аргумент, но, увы, он этого не делает.)

Возможно, однако, вывести четыре байта сообщения, которые задали бы CRC, чтобы дать требуемое значение. Вы можете сделать reset(), а затем update() с этими четырьмя байтами, чтобы установить CRC на то, что вы хотите. spoof code может сделать это за вас.

spoof немного для этого, но вы можете извлечь из этого кода то, что необходимо. На самом деле все, что нужно это Ах + Ь, где является константой 32х32 бит матрицей, х является искомым CRC, и б 32-битовой константа а, и в результате 32 бита (четыре байты) для подачи, чтобы получить желаемый CRC. Матричное умножение и добавление векторов выполняются по модулю 2, где исключает или заменяет сложение, а оператор и заменяет умножение.

+0

Благодарим за подробный ответ. Марк, я нашел эту [библиотеку] (https://github.com/ymnk/jzlib) и имеет [сброс] (https://github.com/ymnk/jzlib /blob/master/src/main/java/com/jcraft/jzlib/CRC32.java), который делает то, что мне нужно. Я протестировал его, и он возвращает то же значение с образцом Python. – uahakan

 Смежные вопросы

  • Нет связанных вопросов^_^