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

时间:2015-03-13 13:28:29

标签: c# concatenation bit bit-shift uint16

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

假设UInt16数组名为r,我想要的“最终”值为val1val2,那么我必须执行以下操作:

6

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

我已经尝试(逻辑上)bit-rightshift r[0]加8,但随后高位丢失,因为它们存储在r[1]的前8位中。我必须首先连接所有r值并在此之后进行位移吗?我怎样才能做到这一点?提前谢谢!

1 个答案:

答案 0 :(得分:2)

  

我已经尝试(逻辑上)将右移R [0]加8,但随后高位丢失,因为它们存储在r [1]的前8位中。

他们不会失去" - 他们只是在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);