我有一个二进制协议(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/