Пожалуйста, узнайте, как использовать отладчик, см. Что такое отладчик и как он может помочь мне диагностировать проблемы? .
При этом у вас есть некоторые проблемы с вашим кодом. Сначала вы вычисляете контрольную сумму для пустого массива. Когда вы пишете:
byte readBuffer[] = new byte[buffer.length];
cis.read(readBuffer);
, вы читаете пустой массив размером с массив buffer
. Вам не нужно создавать новый массив. На самом деле, вы должны прочитать массив buffer
, который у вас уже есть, так как там есть ваш контент. В этом случае вы просто пишете:
cis.read(buffer);
Следующая проблема заключается в том, что вы используете программы чтения и записи, которые используются для текстовых / строковых файлов, но алгоритм контрольной суммы / ha sh обычно работает на уровне байтов. , Это может привести к нескольким ошибкам, таким как кодирование (ASCII, UTF-8 и т. Д. c. Stuff) и проблемам с завершением строки (\n
против \r\n
против \r
).
Однако В этом случае вы работаете с readLine()
. Этот метод не возвращает окончание строки в конце, см. документацию readLine()
:
Возвращает:
Строка, содержащая содержимое строки, без учета символов окончания строки , или ноль, если достигнут конец потока
Итак, из чего вы читаете файл не тот, который на самом деле в файле. Но ваш CheckSum
класс читает каждый байт в сохраненном файле (как и должно быть). Предположим, вы вводите только строку "abc"
. Ваше первое вычисление будет выполнено для массива длиной 3 байта со значениями:
[97,98,99]
Окончание строки игнорируется методом readLine()
, но оно все еще присутствует в файле. Когда вы проверяете контрольную сумму со второй программой, InputStream
, который вы используете, будет видеть следующие байты:
[97,98,99,10]
(Количество байтов в конце зависит от используемой вами ОС)
Как видите, вы запускаете контрольную сумму для разных байтовых массивов, что приводит к различным значениям контрольной суммы. Поэтому убедитесь, что вы выполняете проверки контрольной суммы для одного и того же содержимого байтового массива (или содержимого InputStream
), чтобы получить одинаковую контрольную сумму в обоих приложениях.