将C字节数组解析为Java ByteBuffer。

时间:2013-08-09 16:40:55

标签: java c 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();
    // ............................
}

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

2 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:3)

如果字节顺序(小vs大端)是问题,你可以将ByteBuffer的字节顺序设置为native而不改变所有程序:

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

另一方面,如果您发现ByteBuffer对象比字节数组更方便,请告诉C程序员返回direct byte buffer而不是数组:对所有各方来说更容易,而且可能更有效。

相关问题