我正在解析一个包含不同类型变量的字节数组。我正在把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程序员返回一个直接的字节缓冲区,而不是数组:这对各方来说都更容易,而且可能更高效。