将 C 字节数组解析为 Java ByteBuffer。
Posted
技术标签:
【中文标题】将 C 字节数组解析为 Java ByteBuffer。【英文标题】:Parse C byte array into Java ByteBuffer. 【发布时间】:2013-08-09 16:40:55 【问题描述】:我正在解析一个包含不同类型变量的字节数组。我正在从连接到我的手机的 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();
// ............................
但是这个变量的值不正确。谁能告诉我我做错了什么?
【问题讨论】:
我认为连接意味着您通过网络获取它?小端与大端如何,即字节顺序。 【参考方案1】:有些系统具有 LitteEndian 字节顺序和 BigEndian。
java 使用 BigEndian。
如果c程序员用小端写字节数组,你可以使用基于Appache LittleEndianInputStream的DataInputStream:
LittleEndianInputStream leis = new LittleEndianInputStream(is);
DataInputStream dis = new DataInputStream(leis);
int i1 = dis.readInt();
short s2 = dis.readShort();
如果您和您的同事定义了二进制接口(文件或字节数组),则始终应强制使用特定的字节顺序(小端或大端)。
【讨论】:
【参考方案2】:如果字节顺序(小端与大端)是问题,您可以将 ByteBuffer
的字节顺序设置为原生,而无需更改所有程序:
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 而不是数组:对所有各方都更容易,并且可能更有效。
【讨论】:
一些变量的类型为 unsigned char 或 unsigned short。为他们使用方法 getShort() 或 getChar() 是否正确? 没错,位是一样的。该符号仅影响值如何显示或转换为更广泛的类型。 现在我的问题是字节缓冲区中的每个 char 变量只有 1 个字节。所以我不能使用 getChar() 方法,因为它从 2 个字节生成 char。我正在尝试将字节转换为字符: char c = (char) (byteBuffer.get() 没错,C 中的 char 是 Java 中的字节。缓冲区中包含字符的部分,它代表文本吗?字符编码是什么? 不,它代表数字。 1 个字节 - 1 个无符号字符变量。以上是关于将 C 字节数组解析为 Java ByteBuffer。的主要内容,如果未能解决你的问题,请参考以下文章