我需要将数值转换为字节数组。例如,要将 long 转换为字节数组,我有以下方法:
public static byte[] longToBytes(long l) {
ByteBuffer buff = ByteBuffer.allocate(8);
buff.order(ByteOrder.BIG_ENDIAN);
buff.putLong(l);
return buff.array();
}
这非常简单 - 取一个很长的值,分配一个可以容纳它的数组,然后把它扔进去。不论其价值如何l
是的,我将得到一个 8 字节数组,然后我可以按预期处理和使用它。就我而言,我正在创建自定义二进制格式,然后通过网络传输它。
当我使用值 773450364 调用此方法时,我得到一个数组[0 0 0 0 46 25 -22 124]
后退。我有代码也可以将字节数组转换回其数值:
public static Long bytesToLong(byte[] aBytes, int start) {
byte[] b = new byte[8];
b[0] = aBytes[start + 0];
b[1] = aBytes[start + 1];
b[2] = aBytes[start + 2];
b[3] = aBytes[start + 3];
b[4] = aBytes[start + 4];
b[5] = aBytes[start + 5];
b[6] = aBytes[start + 6];
b[7] = aBytes[start + 7];
ByteBuffer buf = ByteBuffer.wrap(b);
return buf.getLong();
}
当我将数组从另一个方法传递回此方法时,我得到 773450364,这是正确的。
现在,我通过 TCP 将该数组传输到另一个 Java 客户端。的文档java.io.InputStream.read()
方法说它返回一个int
0 到 255 之间的值,除非到达流末尾并返回 -1。但是,当我使用它填充字节数组时,我继续在接收端获取负值。我怀疑这与溢出有关(值 255 无法放入 Java 字节中,因此当我将其放入字节数组中时,它会溢出并变为负数)。
这让我想到了我的问题。负数的存在让我担心。现在,我正在开发应用程序的 Java 端,其中字节介于 -128 和 127 之间(包含 -128 和 127)。另一个端点可能是 C、C++、Python、Java、C#...谁知道呢。我不确定某些字节数组中负值的存在将如何影响处理。除了记录此行为之外,我可以/应该做些什么来让我自己和未来的开发人员更轻松地在这个系统上工作,特别是在不是用 Java 编写的端点中?