【发布时间】:2020-11-18 03:45:40
【问题描述】:
我想读取包含 32 位无符号整数和 8 位无符号整数的二进制文件。我已经知道DataInputStream,但是它的方法readInt 返回有符号整数并且没有读取无符号整数的方法(16 位和8 位整数有这样的方法)。
读取单独的字节并按位连接它们是“官方”的方式吗?将字节读入ByteArray 并使用位移位和按位ors 从其中组合整数会显着降低性能吗?
【问题讨论】:
-
你想要哪种结果数据类型?
-
例如,您可以使用
long value = Integer.toUnsignedLong(dataInputStream.readInt());。或者您只需使用int value = dataInputStream.readInt();并将值解释 为无符号,只要它对算术产生影响。例如。对于+、-和*,没有区别,对于/和%,使用Integer.divideUnsigned(…)和remainderUnsigned(…),同样,compareUnsigned(…)和toUnsignedString(…)。这可以解决很多没有long算术的用例。 -
要读取 8 位无符号整数,请使用 readUnsignedByte。
-
@VGR OP 确实已经承认了 8 位和 16 位方法的存在……
-
@JoopEggen 方法
readUnsignedByte()实际上实现为return 0xFF & readByte();。同样,toUnsignedLong方法实现为return x & 0xFFFF_FFFFL;(但请注意,它的八个Fs 不是四个),尽管某些 JVM 可能会在合适时将其替换为内部操作。大多数时候,当我需要这些东西时,我也会使用ByteBuffer,而不是旧的DataInputStream。除了支持其他字节序之外,它还允许切片、批量传输以及与字符集解码器的互操作性……
标签: java kotlin jvm binaryfiles java-io