这感觉应该很简单,但我找不到答案..
在python脚本中,我正在读取USB设备的数据(USB鼠标的x和y移动)。它以单个ASCII字符到达。我可以使用ord轻松转换为无符号整数(0-255)。但是,我希望它是有符号整数(-128到127) - 我该怎么做?
任何帮助非常感谢!非常感谢。
答案 0 :(得分:4)
如果超过127,则减去256:
unsigned = ord(character)
signed = unsigned - 256 if unsigned > 127 else unsigned
或者,使用struct
模块重新打包字节:
from struct import pack, unpack
signed = unpack('B', pack('b', unsigned))[0]
或直接来自角色:
signed = unpack('B', character)[0]
答案 1 :(得分:1)
使用此函数获取带符号的8位整数值
def to8bitSigned(num):
mask7 = 128 #Check 8th bit ~ 2^8
mask2s = 127 # Keep first 7 bits
if (mask7 & num == 128): #Check Sign (8th bit)
num = -((~int(num) + 1) & mask2s) #2's complement
return num
答案 2 :(得分:0)
from ctypes import c_int8
value = c_int8(191).value
使用带有ord()值的ctypes - 在这种情况下应为-65
离。来自字符串数据
from ctypes import c_int8
data ='BF'
value1 = int(data, 16) # or ord(data.decode('hex'))
value2 = c_int8(value1).value
value1是十六进制'BF'的16位整数表示,value2是8位表示
答案 3 :(得分:0)
我知道这是一个老问题,但我在其他地方找不到令人满意的答案。
您可以使用阵列模块(它具有转换完整缓冲区的额外便利性):
from array import array
buf = b'\x00\x01\xff\xfe'
print(array('b', buf))
# result: array('b', [0, 1, -1, -2])
答案 4 :(得分:0)
要将任何输入字节转换为有符号整数:
def signed8bit_to_int(input):
(((input >> 7) * 128) ^ input) - ((input >> 7) * 128)
Examples:
signed8bit_to_int(0xc0) = -64
signed8bit_to_int(0xbf) = -65
signed8bit_to_int(0x0f) = 15
以0xC0为例的解释: