2010-01-12 2 views
0

Я получил этот питон скрипт, который генерирует контрольную сумму файла:питон для вычисления контрольной суммы Java

import sys,os 

if __name__=="__main__": 
#filename=os.path.abspath(sys.argv[1]) 
#filename=r"H:\Javier Ortiz\559-7 From Pump.bin" 
cksum=0 
offset=0 
pfi=open(filename,'rb') 
while 1: 
    icks=0 
    chunk=pfi.read(256) 
    if not chunk: break  #if EOF exit loop 

    for iter in chunk: 
    icks+=ord(iter) 
    print ord(iter) 
    cksum=(cksum+icks) & 0xffff 
pfi.close() 
print "cksum=0x%4.4x"%cksum 

И я пытаюсь преобразовать его в Java, но я не адресности те же результаты.

Вот мой Java-код:

import java.io.BufferedInputStream; 
import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

public class ChecksumCalculator { 

private ChecksumCalculator() { 
} 

public static int getChecksum(File file) { 
    int cksum = 0; 
    FileInputStream fis = null; 
    BufferedInputStream bis = null; 
    DataInputStream dis = null; 
    try { 
     fis = new FileInputStream(file); 

     // Here BufferedInputStream is added for fast reading. 
     bis = new BufferedInputStream(fis); 
     dis = new DataInputStream(bis); 
     byte[] buffer = new byte[256]; 
     // dis.available() returns 0 if the file does not have more lines. 
     while (dis.read(buffer) != -1) { 
      int icks = 0; 
      for (byte b : buffer) { 
       icks += b & 0xff; 
       System.out.println(b & 0xff); 
      } 
      cksum = (cksum + icks) & 0xffff; 
      System.out.println("Checksum: " + cksum); 
     } 

     // dispose all the resources after using them. 
     fis.close(); 
     bis.close(); 
     dis.close(); 
     return cksum; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     return -1; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return -1; 
    } 
} 

static public void main(String[] s) { 
    System.out.println("0x" + getChecksum(new File("H:\\Javier Ortiz\\559-7 From Pump.bin"))); 
} 

}

Но я получаю разные результаты на файле. Например, если я запускаю его на простой текстовый файл, содержащий только слово тестирования он выдает следующий результат:

питон: CKSUM = 0x01c0 Java: CKSUM = 0x448

Любая идея?

+0

Использовать протоколирование и сравнивать, где icks плохо. – Tobu

ответ

5

Ваша версия Python печатает контрольную сумму в шестнадцатеричном виде, в то время как ваша версия Java печатает ее в десятичной системе. Вы также должны напечатать свою версию Java в шестнадцатеричном формате. 0x1c0 == 448.

Чтобы использовать строку формата cksum=0x%4.4x, как вы были в вашей версии Python, используйте:

System.out.printf("cksum=0x%4.4x%n", ...); 

или даже лучше

System.out.printf("cksum=%#04x%n", ...); 

Кроме того, вам не нужно a DataInputStream для этого. Просто используйте bis.read(buffer) вместо dis.read(buffer).

+0

Использование bis.reader дало мне те же самые значения. Любая идея о том, как печатать hex в Java? Я попробовал java.lang.Integer.toHexString, не увидев изменения. – javydreamercsw

+0

Использование формата System.out по-прежнему выводится 0x448 – javydreamercsw

+0

Не против последнего комментария. Мне просто нужно было чистить и строить. Благодаря! – javydreamercsw

1
  1. dis.read(buffer) возвращает количество фактически прочитанных байтов. Для последнего фрагмента он, вероятно, будет меньше 256. Таким образом, цикл for не всегда должен выполняться 256 раз - он должен выполняться столько раз, сколько фактический счетчик байтов, который был прочитан из потока.

  2. Я не разработчик Python, но он не похож на ord(icks) в Python делает то же самое, что и b & 0xff в Java.

  3. Имейте в виду, что все типы Java подписаны; это может повлиять на расчет.

Кроме того, хотя это не влияет на корректность - это хорошая практика, чтобы очистить все ресурсы (то есть, чтобы закрыть потоки) в finally блоке.

+0

Спасибо. Изменена эта строка: для (int i = 0; i javydreamercsw

+0

ord() делает то же, что и b & 0xff, конвертирует из байта в ascii. – javydreamercsw

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