如何使用Java ByteBuffer

时间:2015-10-11 15:40:35

标签: java android bytearray bytebuffer

我有一个Android应用程序,它使用ByteBuffer将一组int(转换为字符串)发送到我的服务器,该服务器是用Ruby编写的。服务器获取字符串并将其解压缩。我构建ByteBuffer的代码如下所示:

ByteBuffer bytes = ByteBuffer.allocate(16);
bytes.order(ByteOrder.LITTLE_ENDIAN);

bytes.putInt(int1);
bytes.putInt(int2);
bytes.putInt(int3);
bytes.putInt(int4);

String byteString = new String(bytes.array());

当int都是正值时,这很有用。当它有一个负int时,事情就会出错。例如,在我提交像[1,1,-1,0]这样的整数数组的iOS中,服务器上的字节字符串是:

"\x01\x00\x00\x00\x01\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"

将其正确解压缩到[1,1,-1,0]。

然而,在Android中,当我尝试提交相同的[1,1,-1,0]数组时,我的字符串是:

"\x01\x00\x00\x00\x01\x00\x00\x00\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\x00\x00\x00\x00"

将其解压缩到[1,1,-272777233,-1074807361]。

如果我将负int转换为unsigned int:

byte intByte = (byte) -1;
int unsignedInt = intByte & 0xff;

我得到以下内容:

"\x01\x00\x00\x00\x01\x00\x00\x00\xEF\xBF\xBD\x00\x00\x00\x00\x00\x00\x00"

将其解压缩为[1,1,12435439,0]。我希望有人可以帮我弄清楚如何正确处理这个问题,这样我就可以正确地发送负值。

1 个答案:

答案 0 :(得分:3)

你的问题在这里:

String byteString = new String(bytes.array());

为什么这样做?您想发送一个字节流,那么为什么要将它转换为char s?

的流

如果要发送字节,请发送字节。使用OutputStream,而不是Writer;使用InputStream,而不是Reader。整数是“消极的”或“积极的”这一事实并不重要。