gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:24:57 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com