Java中类似于Python的结构体功能
我有一个用Python写的程序,目的是在TIFF文件的IFD中找到特定的标签并返回它们的值。这个程序只是一个概念验证的东西,现在我需要把这个功能转移到Java上。我想我可以用String(byteArray[])
这个构造函数来处理ASCII数据类型,但我还需要获取无符号短整型(2字节)
和无符号长整型(4字节)
的值。我不需要把它们写回文件或修改,只需要从中获取Java的Integer
或Long
对象就可以了。在Python中,用struct
和mmap
类来做这些事情很简单,有人知道Java中有没有类似的方法吗?我看过DataInput
类,但它的readUnsignedLong
方法是读取8个字节的。
5 个回答
我查看了DataInput类,但发现
readUnsignedLong
方法读取的是8个字节。
在Java中,没有无符号类型。一个int
需要4个字节,而一个long
需要8个字节,无论是有符号还是无符号。
如果你不想使用DataInput
,可以将字节读取到字节数组(byte[]
)中,然后使用ByteBuffer
来把这些字节值转换成int
和long
,并进行左侧填充。可以查看ByteBuffer#getInt()
和ByteBuffer#getLong()
的用法。
使用DataInput会是更好的选择。你可以用readUnsignedShort来读取两个字节的值。对于四个字节的值,你需要使用这个解决方法...
long l = dis.readInt() & 0xffffffffL;
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字节字段的高端值,你可以不使用位掩码。否则,你需要使用更大的数据类型,因为无符号值的范围比有符号值要大。