我有一些来自我的气象站的二进制数据,我需要转换成十进制。我必须合并2个字节,然后右移4。目前我这样做:
byte1 = 251
byte2 = 74
result = (byte1 * 256 + byte2) >> 4
print(result)当输入的数据是正数时,这很好用,但是当它是负数时,它是2的补码格式,并且上面的代码不能正确地处理它。结果是4020,但我想要-76。
我如何让它正确处理2的补码?
发布于 2019-01-22 05:37:35
尝试:
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.....0000 0000 0000
如果您的传入byte1大于128 (因此是一个负数),我们只需对您的byte1byte2数进行OR运算,即可得到中间结果:
1111 1111 1111 .....1111 1011 0100 1010
这显然更接近我们想要的。然后向右移动4。(当我们向右移动时,最左边的4位数字当然会用1填充):
1111 1111 1111 .....1111 1111 1011 0100
这是您想要的值:-76
https://stackoverflow.com/questions/54297651
复制相似问题