如何在 Java 中将a 转换long为 a并返回?byte[]
long
byte[]
我正在尝试将 a 转换long为 abyte[]以便能够byte[]通过 TCP 连接发送。另一方面,我想把byte[]它转换回double.
double
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; }