如何移位和连接以获得正确的结果?
How to bit-shift and concatenate to get correct result?
我目前正在努力处理 modbus tcp,运行 遇到了解释模块响应的问题。响应包含两个值,这些值编码在三个 UInt16
值数组的位中,其中 r[0] 的前 8 位必须被忽略。
假设 UInt16 数组被称为 r
并且我想要获得的 "final" 值是 val1
和 val2
,那么我必须执行以下操作:
在上面的示例中,对于输入值 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);
我目前正在努力处理 modbus tcp,运行 遇到了解释模块响应的问题。响应包含两个值,这些值编码在三个 UInt16
值数组的位中,其中 r[0] 的前 8 位必须被忽略。
假设 UInt16 数组被称为 r
并且我想要获得的 "final" 值是 val1
和 val2
,那么我必须执行以下操作:
在上面的示例中,对于输入值 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);