我正在使用struct.unpack('>h', ...)
解压缩一些我通过串行链接从某些硬件接收到的16位带符号的数字。
事实证明,谁使硬件不是2的补码表示的核心,而代表一个负数,他们就是翻转MSB。struct
是否可以解码这些数字?还是我必须自己做一点操作?
最佳答案
正如我在评论中所说,文档中没有提到这种可能性。但是,如果您想手动进行转换,则并不太困难。下面是一个简短示例,说明如何使用numpy
数组:
import numpy as np
def hw2complement(numbers):
mask = 0x8000
return (
((mask&(~numbers))>>15)*(numbers&(~mask)) +
((mask&numbers)>>15)*(~(numbers&(~mask))+1)
)
#some positive numbers
positives = np.array([1, 7, 42, 83], dtype=np.uint16)
print ('positives =', positives)
#generating negative numbers with the technique of your hardware:
mask = 0x8000
hw_negatives = positives+mask
print('hw_negatives =', hw_negatives)
#converting both the positive and negative numbers to the
#complement number representation
print ('positives ->', hw2complement(positives))
print ('hw_negatives ->',hw2complement(hw_negatives))
该示例的输出为:
positives = [ 1 7 42 83]
hw_negatives = [32769 32775 32810 32851]
positives -> [ 1 7 42 83]
hw_negatives -> [ -1 -7 -42 -83]
希望这可以帮助。
关于python - Python结构解压和负数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45101312/