我需要将数值转换成字节数组。例如,将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