如何移位和连接以获得正确的结果?

How to bit-shift and concatenate to get correct result?

我目前正在努力处理 modbus tcp,运行 遇到了解释模块响应的问题。响应包含两个值,这些值编码在三个 UInt16 值数组的位中,其中 r[0] 的前 8 位必须被忽略。

假设 UInt16 数组被称为 r 并且我想要获得的 "final" 值是 val1val2,那么我必须执行以下操作:

在上面的示例中,对于输入值 r[0]=768、r[1],所需的输出值为 val1 (=3) 和 val2 (=6) =1536 且 r[2]=0,所有值为 UInt16.

我已经尝试(逻辑上)将 r[0] 右移 8 位,但是高位丢失了,因为它们存储在 r[1] 的前 8 位中。我是否必须先连接所有 r 值,然后再进行位移?我怎样才能做到这一点?提前致谢!

I already tried to (logically) bit-rightshift r[0] by 8, but then the upper bits get lost because they are stored in the first 8 bits of r[1].

嗯,它们不是 "lost" - 它们只是在 r[1] 中。

一步一步分解可能是最简单的:

byte val1LowBits = (byte) (r[0] >> 8);
byte val1HighBits = (byte) (r[1] & 0xff);
byte val2LowBits = (byte) (r[1] >> 8);
byte val2HighBits = (byte) (r[2] & 0xff);

uint val1 = (uint) ((val1HighBits << 8) | val1LowBits);
uint val2 = (uint) ((val2HighBits << 8) | val2LowBits);