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

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

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

数据字段数为5个。

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

Sent dataset1: 1, 0, 0, 2, 22
Sent dataset2: 1, 0, 0, 2, 500
Example 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的各种方式接收了。

标签: java sockets bytearray bytebuffer


【解决方案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 来操作各种值,例如单个标头字段

      谢谢

      【讨论】: