繁体   English   中英

java 的功能与 python 的结构类似

[英]Similar functionality for java to struct for python

我有一个在 Python 中制作的程序,用于在 TIFF IFD 中查找特定标签并返回值。 这只是 python 中的概念证明,现在我需要将功能移至 java。 我想我可以只对 ASCII 数据类型使用String(byteArray[])构造函数,但我仍然需要获取Unsigned short (2 byte)unsigned long (4 byte)值。 我不需要将它们写回文件或修改它们,我需要做的就是从他们那里得到一个 Java IntegerLong object 。 这在具有structmmap类的 python 中很容易,有人知道 java 中的类似方法吗? 我查看了DataInput class,但readUnsignedLong方法读取了 8 个字节。

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 字节字段的高端,则可以放弃位掩码。 否则,您需要使用更广泛的数据类型来说明无符号值比有符号值包含更大范围的值这一事实。

我查看了 DataInput class,但readUnsignedLong方法读取了 8 个字节。

Java 没有无符号类型。 制作一个int需要 4 个字节,制作一个long 、无符号或其他类型需要 8 个字节。


如果您不想使用DataInput ,您可以将字节读入字节 arrays ( byte[] ) 并使用ByteBuffer将这些字节值转换为int s 和long s 并带有左填充。 请参阅ByteBuffer#getInt()ByteBuffer#getLong()

DataInput 将是首选方法。 您可以将 readUnsignedShort 用于两个字节值。 对于 4 字节值,您必须使用此解决方法...

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

您可以使用 Javolution 的Struct class 为数据区域提供结构。 您设置了一个包装器,然后使用该包装器访问数据。 简单的。 Java 在其默认类路径 TBQH 中确实需要这个超级有用的 class。

Preon 库很适合在 Java 中创建结构。 我已经尝试过 Javolution 的 Struct,但这对我的情况没有帮助。 它是开源的,非常好的库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM