【发布时间】:2011-12-28 15:32:18
【问题描述】:
我需要将数值转换为字节数组。例如,要将 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() 方法的文档说它返回一个介于 0 和 255 之间的 int 值,除非到达流的末尾并返回 -1。但是,当我使用它填充字节数组时,我继续在接收端获取负值。我怀疑这与溢出有关(值 255 无法放入 Java 字节,所以当我将其放入字节数组时,它会溢出并变为负数)。
这让我想到了我的问题。负数的存在与我有关。现在,我正在开发应用程序的 Java 端,其中一个字节介于 -128 和 127 之间。另一个端点可能是 C、C++、Python、Java、C#……谁知道呢。我不确定某些字节数组中负值的存在将如何影响处理。 除了记录这种行为之外,我可以/应该做些什么来让自己和未来的开发人员在这个系统上工作更容易,尤其是在不是用 Java 编写的端点中?
【问题讨论】:
-
在调用
getLong()之前,您不应该在bytesToLong方法中设置ByteBuffer 的字节序,使其与longToBytes相同吗?与您的问题无关,只是想知道... -
@G_H 我应该调查一下并进行测试。实际上我自己并没有编写这些方法中的任何一个,并且测试用例......缺乏。感谢您指出这一点。
标签: java bytearray byte inputstream bytebuffer