java - ByteBuffer putLong() 用于 long 的 7 字节值

标签 java long-integer bytebuffer endianness

我有一个。我知道这个 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/

相关文章:

java - java中的synchronized block 是否真的获取整个对象锁?

c++ - 乘以 100 万

c - 整数和长整数的大小?

java - Little Endian 到 Big Endian 精度误差

java - 从 ReadOnly java.nio.ByteBuffer 中提取字符串

java - hibernate 和 oracle 序列 GenericGenerator 造成差距

java - JAXB 解码和继承

java - 确定合适的缓冲区大小

java - 如何在 Spring 应用程序上下文中将 Class<?> 设置为属性值?

c - 如何在 C/C++ 中获得大数的精确二进制表示?