我从气象站获得了一些二进制数据,需要将其转换为十进制。我必须合并2个字节,然后右移4个。目前,我这样做如下:
byte1 = 251
byte2 = 74
result = (byte1 * 256 + byte2) >> 4
print(result)
当传入数据为正数时,此方法工作正常,但为负数时,它为2的补码格式,并且上面的代码无法正确处理它。结果是4020,但我要-76。
如何使它正确处理2的补码?
答案 0 :(得分:1)
byte1 = 251
byte2 = 74
byte_mask = ~0xFFFF
if (byte1>=128):
result = ( ((byte1 << 8) + byte2) | byte_mask ) >> 4
else:
result = ((byte1 << 8) + byte2) >> 4
我们都知道2的补码是什么...如果最左边的位是1,则数字是负数,我们应该执行2的补码来获得数字。那是容易的部分。困难的部分是您正在使用Python工作。 Python的编号既是福也是祸,因为Python的编号是无限的(大致而言)。我们需要以某种方式将无限数的所有最左位设置为1,这样您就可以做到:
byte_mask = ~0xFFFF
现在byte_mask是1111 1111 1111 1111 1111 1111 ..... 0000 0000 0000 0000
如果您传入的byte1大于128(因此为负数),我们对您的byte1byte2数进行“或”运算,得到中间结果:
1111 1111 1111 1111 ..... 1111 1011 0100 1010
显然,这更接近我们想要的东西。然后向右移动4。(当我们向右移动时,最左边的4位数字当然会用1填充):
1111 1111 1111 1111 ..... 1111 1111 1011 0100
您想要的是小数形式的-76