【问题标题】:converting byte[] array to unsigned Long java将 byte[] 数组转换为 unsigned Long java
【发布时间】:2018-05-02 20:17:03
【问题描述】:

你能回答这个与java有关的疑问吗..

我想将MAX_VALUE 的无符号long(即2(pow)64 -1)存储为一个n 字节数组,然后读取byte[] 数组以取回这个MAX_VALUE。 由于所有数据类型都是有符号的,所以想知道如何在 byte[] 数组的每个索引中存储 0xFF(每个字节)值,即忽略有符号位。请建议如何执行此操作。 谢谢。

【问题讨论】:

  • 2 的补码二进制表示中没有符号位。
  • “我想存储MAX_VALUE的无符号long(即2(pow)64 -1)一个字节数组”好的:byte[] b = {-1, -1, -1, -1, -1, -1, -1, -1}跨度>

标签: java byte long-integer unsigned


【解决方案1】:

这样的?

public class Utils {
    static byte[] longToByteArray(long value) {
        return ByteBuffer.allocate(8).putLong(value).array();
    }

    static long byteArrayToLong(byte[] array) {
        return ByteBuffer.wrap(array).getLong();
    }

    public static void main(String[] args) {
        long maxValue = Long.parseUnsignedLong("FFFFFFFFFFFFFFFF", 16);
        byte[] b = longToByteArray(maxValue);
        System.out.println("b = " + Arrays.toString(b));

        long value = byteArrayToLong(b);
        System.out.println("value = " + value);
        System.out.println("hex value = " + Long.toUnsignedString(value, 16));
    }
}

【讨论】:

  • 使用ByteBuffer 可能比使用DataInputStream /DataOutputStream 更好。更少的开销,您可以选择大端与小端模式。
  • 另外,"FFFFFFFF" 只是 MAX_UNSIGNED_INT。你需要加倍,即"FFFFFFFFFFFFFFFF"MAX_UNSIGNED_LONG
  • @Andreas 绝对。现在修好了。对ByteBuffer不太习惯,所以希望这是最好的使用方式。
  • 不需要LongBuffer。只需在ByteBuffer 上使用putLonggetLong,您就可以将其全部链接起来:return ByteBuffer.allocate(8).putLong(value).array();return ByteBuffer.wrap(array).getLong();
  • 如果你想要 Little Endian,你可以将它添加到链中,例如return ByteBuffer.wrap(array).order(ByteOrder.LITTLE_ENDIAN).getLong();
猜你喜欢
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多