gpt4 book ai didi

java - python 到 Java 校验和计算

转载 作者:行者123 更新时间:2023-12-01 06:59:44 26 4
gpt4 key购买 nike

我收到了这个生成文件校验和的 python 脚本:

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")));
}

}

但是我在文件上得到了不同的结果。例如,如果我在仅包含单词 test 的纯 txt 文件上运行它,则会给出以下结果:

python: cksum=0x01c0java: cksum=0x448

有什么想法吗?

最佳答案

您的 Python 版本以十六进制打印校验和,而您的 Java 版本以十进制打印校验和。您也应该让您的 Java 版本以十六进制打印。 0x1c0 == 448。

要使用 Python 版本中的 cksum=0x%4​​.4x 格式字符串,请使用以下命令:

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

甚至更好

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

此外,您不需要为此使用DataInputStream。只需使用 bis.read(buffer) 而不是 dis.read(buffer)

关于java - python 到 Java 校验和计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2050325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com