我正在解析一个包含不同类型变量的字节数组。我从连接到手机的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();
// ............................
}
但这些变量的值不正确。谁能告诉我我做错了什么?
答案 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而不是数组:对所有各方来说更容易,而且可能更有效。