gpt4 book ai didi

java - 尝试从二进制文件读取非 Java 原语

转载 作者:行者123 更新时间:2023-12-01 16:41:50 27 4
gpt4 key购买 nike

我正在尝试从一个程序中读取一个二进制文件,该程序将日志(某种)写入一个dat文件,我已经很好地找到了使用Java的格式。我这样加载它:

DataInputStream in = new DataInputStream(new FileInputStream("file.dat"));

System.out.println("Bytes skipped: " + in.skipBytes(4));

System.out.println(in.readLong());

问题是 readLong() 的值与我的预期不同,在 Hex Workshop 中我突出显示了十六进制 block

BF02 0000

并报告它是一个有效的带符号的短/长数字 - 但是输出与我的预期非常不同。查看 Java 文档,它指出它将 long 分类为 64 位(8 字节),而其他来源显示有符号长整型应该为 32 位 - 有没有办法解决这个问题?

干杯,

汤姆

最佳答案

原始类型在不同的语言和不同的平台中意味着不同的东西。 (例如,在 C 语言中,long 在某些平台上为 32 位,而在其他平台上为 64 位,这种情况并不罕见。

首先,您必须知道 .dat 文件中的类型以及字节顺序(大/小端)。然后将各个字节组装成适当的 java 类型。如果 .dat 文件指定 32 位有符号整数,则 java 中的 int 就合适。如果它是一个无符号的 32 位整数,您可能需要在 java 中使用 long 来捕获所有可能的值,因为 java 没有无符号类型。

如果文件中的整数是little endian,则按如下方式读取:

 int i = (in.readByte()) | (in.readByte() << 8) | (in.readByte() << 16) | (in.readByte() << 24)

如果是大尾数,则执行

int i = (in.readByte() << 24) | (in.readByte() << 16) | (in.readByte() << 8) | (in.readByte())

(我不记得atm了。这里java中的提升规则,你可能需要在位移之前用&0xff来生成一个int)当然,如果需要,您可以读入字节数组并对该数组进行操作,而不是单独调用 in.readByte() 。

关于java - 尝试从二进制文件读取非 Java 原语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1099089/

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