将C字节数组解析为Java ByteBuffer



我正在解析一个包含不同类型变量的字节数组。我正在把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();
    // ............................
}

但是这些变量的值是不正确的。有人能告诉我我做错了什么吗?

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

java使用BigEndian。

如果c程序员用Littleendian编写字节数组,则可以使用基于Appache LittleEndianInputStream的DataInputStream:

LittleEndianInputStream leis = new LittleEndianInputStream(is);
DataInputStream dis = new DataInputStream(leis);
int i1 = dis.readInt();
short s2 = dis.readShort();

如果你和你的同事定义了一个二进制接口(文件或字节数组),你总是应该强制使用特定的字节顺序(小端或大端)。

如果字节顺序(little vs big endian)是问题所在,您可以将ByteBuffer的字节顺序设置为本机,而无需更改所有程序:

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

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

最新更新