1

我正在解析一个包含不同类型变量的字节数组。我正在从连接到我的手机的 HID 获取这个阵列。数组是由 C 程序员制作的。我正在尝试使用 ByteBuffer 类解析它:

byte[] buffer = new byte[64];
if(connection.bulkTransfer(endpoint, buffer, 64, 1000) >= 0)
{
    ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
    char mId = byteBuffer.getChar();
    short rId = byteBuffer.getShort();
    // ............................
}

但是这个变量的值是不正确的。谁能告诉我我做错了什么?

4

2 回答 2

4

有具有 LitteEndian 字节顺序和 BigEndian 的系统。

java使用BigEndian。

如果 c 程序员在 Little Endian 中编写字节数组,您可以使用基于 Appache LittleEndianInputStream 的 DataInputStream:

LittleEndianInputStream leis = new LittleEndianInputStream(is);
DataInputStream dis = new DataInputStream(leis);

int i1 = dis.readInt();
short s2 = dis.readShort();

如果您和您的同事定义了二进制接口(文件或字节数组),则始终应强制使用特定的字节顺序(小端或大端)。

于 2013-08-09T16:45:26.593 回答
3

如果字节顺序(小端与大端)是问题,您可以将字节顺序设置为本ByteBuffer机而不更改所有程序:

ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
byteBuffer.order(ByteOrder.nativeOrder()); // Set native byte order
char mId = byteBuffer.getChar();
short rId = byteBuffer.getShort();

另一方面,如果您发现 ByteBuffer 对象比字节数组更方便,请告诉 C 程序员返回一个直接字节缓冲区而不是数组:对所有各方都更容易,并且可能更有效。

于 2013-08-09T17:20:47.910 回答