将ascii字符转换为带符号的8位整数python

时间:2013-06-12 14:14:11

标签: python integer ascii signed

这感觉应该很简单,但我找不到答案..

在python脚本中,我正在读取USB设备的数据(USB鼠标的x和y移动)。它以单个ASCII字符到达。我可以使用ord轻松转换为无符号整数(0-255)。但是,我希望它是有符号整数(-128到127) - 我该怎么做?

任何帮助非常感谢!非常感谢。

5 个答案:

答案 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为例的解释:

  • 0xc0'0b1100 0000',其最后一位为1,表示它是有符号字节
  • 第1步:测试有符号位:((((input >> 7)* 128)
  • 第2步:如果它是带符号的位,请反转输入位:
    从:100 0000到0111 1111(以10为底的63)
  • 第3步:通过证实128来转换上述内容: 63-128 = -65