小编典典

如何将 Long 转换为 byte[] 并返回到 java

all

如何在 Java 中将a 转换long为 a并返回?byte[]

我正在尝试将 a 转换long为 abyte[]以便能够byte[]通过 TCP
连接发送。另一方面,我想把byte[]它转换回double.


阅读 96

收藏
2022-07-14

共1个答案

小编典典

public byte[] longToBytes(long x) {
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
buffer.putLong(x);
return buffer.array();
}

public long bytesToLong(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
    buffer.put(bytes);
    buffer.flip();//need flip 
    return buffer.getLong();
}

或者包装在一个类中以避免重复创建 ByteBuffers:

public class ByteUtils {
    private static ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);

    public static byte[] longToBytes(long x) {
        buffer.putLong(0, x);
        return buffer.array();
    }

    public static long bytesToLong(byte[] bytes) {
        buffer.put(bytes, 0, bytes.length);
        buffer.flip();//need flip 
        return buffer.getLong();
    }
}

由于这变得如此流行,我只想提一下,我认为在绝大多数情况下你最好使用像 Guava
这样的库。如果你对库有一些奇怪的反对意见,你可能应该首先考虑这个答案用于原生
java 解决方案。我认为我的回答真正要解决的主要问题是您不必自己担心系统的字节序。

我针对普通的按位运算测试了 ByteBuffer 方法,但后者明显更快。

public static byte[] longToBytes(long l) {
    byte[] result = new byte[8];
    for (int i = 7; i >= 0; i--) {
        result[i] = (byte)(l & 0xFF);
        l >>= 8;
    }
    return result;
}

public static long bytesToLong(final byte[] b) {
    long result = 0;
    for (int i = 0; i < 8; i++) {
        result <<= 8;
        result |= (b[i] & 0xFF);
    }
    return result;
}

对于 Java 8+,我们可以使用添加的静态变量:

public static byte[] longToBytes(long l) {
    byte[] result = new byte[Long.BYTES];
    for (int i = Long.BYTES - 1; i >= 0; i--) {
        result[i] = (byte)(l & 0xFF);
        l >>= Byte.SIZE;
    }
    return result;
}

public static long bytesToLong(final byte[] b) {
    long result = 0;
    for (int i = 0; i < Long.BYTES; i++) {
        result <<= Byte.SIZE;
        result |= (b[i] & 0xFF);
    }
    return result;
}
2022-07-14