如何从字节数组元素中解包/提取低阶和高阶值

Posted

技术标签:

【中文标题】如何从字节数组元素中解包/提取低阶和高阶值【英文标题】:How to unpack/extract low-order and high-order value from a Byte array element 【发布时间】:2014-08-13 04:24:35 【问题描述】:

我是位操作新手,我正在通过套接字连接接收数据。

接收到的数据填充在字节缓冲区中,大小为 8。

数据字段数为5个。

数据/字段是可变长度的。因此,似乎两个数据/字段组合为一个字节。

Sent dataset1: 1, 0, 0, 2, 22Sent dataset2: 1, 0, 0, 2, 500Example data received: [1, 0, -128, 22] or [1,0,-127, -12]

当通过套接字发送 5 个数据项时,示例字节数组元素总计 4 个。 我如何parse/unpack/extract byte array element (e.g., -128, -12, etc.) 才能捕获发送的数据集值?

【问题讨论】:

你能详细说明你的问题吗.. 您必须找到该协议的规范。你不能随便猜,我们也不能。拿到后,就可以使用DataInputStream的各种方式接收了。 【参考方案1】:

这个问题听起来很奇怪,如果你有一个字节数组,那么为它的索引获取所需的字节没有任何问题,你需要访问部分字节,然后作为第一个你需要找到的规范协议,因为没有它,您对字段长度一无所知

附言

位解析可以试试JBBP

【讨论】:

【参考方案2】:

更不可能,500 不适合一个字节。 要查看规律,您可能会困惑于十六进制;显示位包装(如果是这种情况);

int[] dataset = new int[5];
byte[] received = new byte[5];

dataset[0] = received[0];
dataset[1] = received[1];
dataset[2] = received[2] - (received[4] < 0 ? 0x7f : 0x80);
dataset[3] = 2;
dataset[4] = received[3];
if (received[4] < 0) 
    dataset[
    dataset[4] += 0x200; // 512

您确实需要更多信息。以上是通过最少的位和操作将两个数据集与接收到的字节匹配的尝试。不过,我不会打赌 1:100 那是正确的解码。

【讨论】:

【参考方案3】:

我修改了我的实现以使用 DataInputStream 从套接字读取数据,如下所示:Java TCP How do you read a sent stream size (header) and keep reading based upon that size 这种方法可以灵活地使用 ByteBuffer 来操作各种值,例如单个标头字段

谢谢

【讨论】:

以上是关于如何从字节数组元素中解包/提取低阶和高阶值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ruby 从二进制字符串中解包一点

解包第一个字节表示长度的数据结构

如何在 C++ 中从字节数组(在 BIG-ENDIAN 中)中提取单个字段

C#如何从字节数组中提取字节?已知起始字节

如何从字节数组中提取长数据类型?

在C#中解压缩字节数组