【问题标题】:Similar functionality for java to struct for pythonjava 与 struct for python 的类似功能
【发布时间】:2011-05-24 14:26:39
【问题描述】:

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

【问题讨论】:

    标签: java python image tiff


    【解决方案1】:

    DataInputStream 允许您阅读短片和长片。您应该使用适当的位掩码(简称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 字节字段的高端,则可以放弃位掩码。否则,您需要使用更广泛的数据类型来解释这样一个事实,即无符号值比其有符号对应值拥有更大范围的值。

    【讨论】:

    • @Much 我终于开始研究这个了,我得到的值是 10752 当我知道这 2 个字节的值实际上是 42 有什么建议吗?
    • 没关系,显然字节顺序与 python 中的 struct 让我相信的相反。这会让事情变得非常复杂
    • @keepitreall89 如果您以某种方式将数据流读入 java.nio.ByteBuffer,您可以指定字节缓冲区的字节顺序并从那里开始。
    • 我最终使用了 RandomAccessFile(因为我需要跳转到很多偏移量)类而不是 FIS,并且基于该类的 javadoc,它只是颠倒了它计算 long 和 int 的顺序。
    【解决方案2】:

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

    Java 没有无符号类型。生成 int 需要 4 个字节,生成 long 需要 8 个字节,无论是无符号还是其他。


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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-23
            • 1970-01-01
            • 2013-04-23
            • 2011-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多