java - 转换字节值,以便删除/恢复其 MSB

标签 java bit-manipulation binary-data

我有一个二进制协议(protocol),它将每个有效负载字节的 MSB 提取到 MSB 集合字节(七进制)中进行传输,并在接收器端重新注入(inject) MSB。有效负载由 n 个四字节帧组成,具体取决于发送者(在我的例子中是六个)。

这些是两个示例帧,及其七字节(最后一个字节),如在线所示:

0x2E 0x00 0x5F 0x00 0x04
0x79 0x01 0x38 0x22 0x04

这些是相同的帧,客户端,重新注入(inject) MSB:

0x2E 0x00 0xDF 0x00
0x79 0x01 0xB8 0x22

执行转换的 C 函数在 this document 第 9 和 10 页上定义。 。我的 Java 版本如下。我遇到的问题是这些都不起作用,我很困惑为什么。我从线路中传递了四个字节,并得到相同的字节,未受影响。我可以使用一些帮助来弄清楚这里出了什么问题(可能是一些我看不到的微不足道的事情)。

private static byte[] vbusExtractSeptett(byte[] data, int offset, int length) {
    byte septett = 0;
    for (int i = 0; i < length; i++) {
        if ((data[offset + i] & 0x80) != 0) {
            data[offset + i] &= 0x7F;
            septett |= 1 << i;
        }
    }

    data[offset + length] = septett;
    return data;
}

private static byte[] vbusInjectSeptett(final byte[] data, int offset, int length) {
    byte septett = data[offset + length];

    for (int i = 0; i < length; i++) {
        if ((septett & (1 << i)) != 0)
            data[offset + i] |= 0x80;
    }

    return data;
}

最佳答案

在 Java 中,字节是有符号的。在没有阅读所有代码的情况下,我敢打赌这就是问题所在。

文档中的 C 代码使用 unsigned char math。

由于 Java 没有“无符号”,因此您可能需要用短整型(或整数)进行所有数学计算,然后转换回字节。确保屏蔽掉符号位,例如类似的东西

byte theResult = theIntIDidtheMathOn & 0xFF;
data[index] = theResult;

关于java - 转换字节值,以便删除/恢复其 MSB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10291262/

相关文章:

java - Scala 和 Kotlin 的手动 JAR 编译

java - 如何为 JTable 中的行创建翻转或悬停效果?

java - 无法将 java.util.HashMap 类型的值转换为字符串

C++ Int 位操作是 2UL = 10UL?

java - 如何在java中进行按位排列

c# - 字节数组到字节转换错误

c++ - 赋值运算符 - 每个成员还是二进制拷贝?

c++ - 在 openCV 中查看 8 位 RAW 图像文件

java - 自定义登录页面 Spring Security 的 403 错误

javascript - Window.open 二进制数据 pdf 正在下载但不显示 pdf :Javascript