我有一个长
。我知道这个 long
不是很大。实际上,它可以被编码为 7 个字节的无符号整数。
我想使用 ByteBuffer
和 little endian 将我的 long
写入 byte[7]
。
这个
long myLong = ... //some value
byte[] myLongBytes = ByteBuffer.allocate(7).order(ByteOrder.LITTLE_ENDIAN).putLong(myLong).array();
当然会抛出 IndexOutOfBoundsException
。我什至可以用 ByteBuffer
做到这一点吗?我应该以不同的方式做吗?
最佳答案
(假设 OP 中指示的小端字节顺序)
(假设您想要存储 long 的 56 个最低有效位)
long myLong = someLongValue & 0x00FFFFFFFFFFFFFFL;
ByteBuffer bb = ByteBuffer.allocate(xxx).order(ByteOrder.LITTLE_ENDIAN);
选项 A:写入 64 位长,然后删除一个字节
bb.putLong(myLong);
bb.position(bb.position()-1);
对于尾写(即这个 long 是对 ByteBuffer
的最后一次写入):
bb.putLong(myLong);
bb.limit(bb.position()-1);
请注意,只有当您可以确保 ByteBuffer
容量足够大以容纳这个临时的额外字节时,此方法才有效。
这种方法应该可行的一些示例:
这个 56bit 值后面总是跟着另一个字段(那么你确定有一些容量储备)
当您严格使用
ByteBuffer.limit()
功能而不是(ab)使用ByteBuffer
进行舒适的字节数组写入时(这由你的帖子)
选项B:写长的“per partes”
bb.putInt((int)myLong);
bb.putShort((short)(myLong>>>32));
bb.put((byte)(myLong>>>48));
这每次都有效。
选项 C:使用 byte[] 而不是 long
您可能会考虑使用字节数组而不是 long(取决于您的用例)。
祝你好运!
关于java - ByteBuffer putLong() 用于 long 的 7 字节值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35741262/