我有一个用Python制作的程序,用于在TIFF IFD中查找特定标签并返回值。它只是python中的概念验证,现在我需要将功能移到java。我想我可以使用String(byteArray[])
构造函数来表示ASCII数据类型,但我仍需要获取Unsigned short (2 byte)
和unsigned long (4 byte)
值。我不需要将它们写回文件或修改它们,我需要做的就是从它们获取Java Integer
或Long
对象。在使用struct
和mmap
类的python中这很容易,在java中有没有人知道类似的方法?我查看了DataInput
类,但readUnsignedLong
方法读取了8个字节。
答案 0 :(得分:5)
DataInputStream可让您阅读短片和长片。您应该使用适当的位掩码(简称0xFFFF
,32位为0xFFFFFFFF
)对其进行掩码,以便考虑有符号/无符号类型之间的差异。
e.g。
// omits error handling
FileInputStream fis = ...;
DataInputStream stream = new DataInputStream(fis);
int short_value = 0xFFFF & stream.readShort();
long long_value = 0xFFFFFFFF & stream.readInt();
如果您确定数据不会朝向2字节字段的高端或4字节字段,则可以放弃位屏蔽。否则,您需要使用更宽的数据类型来解释无符号值比其签名对应值保留更大范围的值这一事实。
答案 1 :(得分:2)
我查看了DataInput类,但
readUnsignedLong
方法读取了8个字节。
Java没有无符号类型。制作int
需要4个字节,制作long
需要8个字节,无符号或其他。
如果您不想使用DataInput
,可以将字节读入字节数组(byte[]
)并使用ByteBuffer
将这些字节值转换为int
带有左边距的s和long
s。请参阅ByteBuffer#getInt()
和ByteBuffer#getLong()
。
答案 2 :(得分:2)
DataInput将是首选方法。您可以将readUnsignedShort用于两个字节值。对于4字节值,您必须使用此workaround ...
long l = dis.readInt() & 0xffffffffL;
答案 3 :(得分:1)
您可以使用Javolution的Struct类,它为数据区域提供结构。您设置了一个包装器,然后使用包装器来访问数据。 Simples。 Java在其默认类路径TBQH中确实需要这个超级有用的类。
答案 4 :(得分:1)
Preon Library可以在Java中创建struct。我尝试过Javolution的Struct,但是我的情况并不完整。它是开源和非常好的库。