访问混合 8/16/32 位字的好方法



我在内存中有一大块二进制数据,我需要从随机访问的字节对齐地址读取/写入。但是,有时我需要读/写 8 位字,有时(大端(16 位字,有时(大端序(32 位字。

有一种

天真的解决方案,将数据表示为ByteArray并手动实现 16/32 位读/写:

class Blob (val image: ByteArray, var ptr: Int = 0) {
  fun readWord8(): Byte = image[ptr++]
  fun readWord16(): Short {
    val hi = readWord8().toInt() and 0xff
    val lo = readWord8().toInt() and 0xff
    return ((hi shl 8) or lo).toShort()
  }
  fun readWord32(): Int {
    val hi = readWord16().toLong() and 0xffff
    val lo = readWord16().toLong() and 0xffff
    return ((hi shl 16) or lo).toInt()
  }
}

(同样适用于writeWord8/writeWord16/writeWord32(。

有没有更好的方法可以做到这一点?当 Java 本身已经在内部使用大端表示时,进行所有这些字节洗牌似乎效率低下......

重申一下,我需要读写访问权限随机搜索和对大端字的 8/16/32 位访问

您可以使用

Java NIO ByteBuffer

val array = ByteArray(100)
val buffer = ByteBuffer.wrap(array)
val b = buffer.get()
val s = buffer.getShort()
val i = buffer.getInt()
buffer.put(0.toByte())
buffer.putShort(0.toShort())
buffer.putInt(0)
buffer.position(10)

新创建的ByteBuffer的字节顺序是BIG_ENDIAN,但仍然可以使用 order(ByteOrder) 函数进行更改。

此外,如果要避免显式创建ByteArray,请使用 ByteBuffer.allocate(size)buffer.array()

有关ByteBuffer用法的更多信息:请参阅此问题。

相关内容

  • 没有找到相关文章

最新更新