将 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。的主要内容,如果未能解决你的问题,请参考以下文章

Java中的解析字节数组

C# 将字节解析为结构顺序

如何将Mac地址转换为十六进制并将其传递给java中的字节数组

C#将对象转换为字节数组

C 字节数组转换成字符串

将 http.Response 转换为字节数组