Java中类似于Python的结构体功能

5 投票
5 回答
2686 浏览
提问于 2025-04-16 18:15

我有一个用Python写的程序,目的是在TIFF文件的IFD中找到特定的标签并返回它们的值。这个程序只是一个概念验证的东西,现在我需要把这个功能转移到Java上。我想我可以用String(byteArray[])这个构造函数来处理ASCII数据类型,但我还需要获取无符号短整型(2字节)无符号长整型(4字节)的值。我不需要把它们写回文件或修改,只需要从中获取Java的IntegerLong对象就可以了。在Python中,用structmmap类来做这些事情很简单,有人知道Java中有没有类似的方法吗?我看过DataInput类,但它的readUnsignedLong方法是读取8个字节的。

5 个回答

2

我查看了DataInput类,但发现readUnsignedLong方法读取的是8个字节。

在Java中,没有无符号类型。一个int需要4个字节,而一个long需要8个字节,无论是有符号还是无符号。


如果你不想使用DataInput,可以将字节读取到字节数组(byte[])中,然后使用ByteBuffer来把这些字节值转换成intlong,并进行左侧填充。可以查看ByteBuffer#getInt()ByteBuffer#getLong()的用法。

2

使用DataInput会是更好的选择。你可以用readUnsignedShort来读取两个字节的值。对于四个字节的值,你需要使用这个解决方法...

long l = dis.readInt() & 0xffffffffL;
5

DataInputStream 让你可以读取短整型(short)和长整型(long)数据。为了处理有符号和无符号类型之间的差异,你需要用合适的位掩码来处理它们(短整型用 0xFFFF,32位整型用 0xFFFFFFFF)。

例如:

// omits error handling
FileInputStream fis = ...;
DataInputStream stream = new DataInputStream(fis);
int short_value = 0xFFFF & stream.readShort();
long long_value = 0xFFFFFFFF & stream.readInt();

如果你确定数据不会接近2字节或4字节字段的高端值,你可以不使用位掩码。否则,你需要使用更大的数据类型,因为无符号值的范围比有符号值要大。

撰写回答