我在内存中有一大块二进制数据,我需要从随机访问的字节对齐地址读取/写入。但是,有时我需要读/写 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
用法的更多信息:请参阅此问题。