我有一个二进制协议,它将每个有效载荷字节的 MSB 提取到一个 MSB 收集字节(septett)中进行传输,并在接收器端重新注入 MSB。有效载荷由 n 个四字节帧组成,具体取决于发送者(在我的情况下为 6 个)。
这是两个示例帧,它们的 septett(最后一个字节),如在线上所示:
0x2E 0x00 0x5F 0x00 0x04
0x79 0x01 0x38 0x22 0x04
这些是相同的帧,客户端,重新注入了 MSB:
0x2E 0x00 0xDF 0x00
0x79 0x01 0xB8 0x22
进行转换的 C 函数在本文档的第 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;
}