7

这感觉应该很简单,但我一直无法找到答案..

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

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

4

6 回答 6

9

如果超过 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]
于 2013-06-12T14:20:36.317 回答
1
from ctypes import c_int8
value = c_int8(191).value

将 ctypes 与您的 ord() 值一起使用 - 在这种情况下应为 -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 位表示

于 2015-12-31T21:24:31.717 回答
1

我知道这是一个老问题,但我在其他地方没有找到令人满意的答案。

您可以使用 array 模块(它转换完整缓冲区的额外便利):

from array import array

buf = b'\x00\x01\xff\xfe'
print(array('b', buf))

# result: array('b', [0, 1, -1, -2])
于 2017-09-27T19:25:29.067 回答
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
于 2017-10-08T12:37:55.020 回答
1

要将任何输入字节转换为有符号整数:

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 步:测试有符号位:(((输入 >> 7) * 128)
  • 第 2 步:如果它是有符号位,则反转输入位:
    从:100 0000 到 0111 1111(以 10 为底的 63)
  • 第 3 步:通过证实 128 来转换上述内容:63 - 128 = -65
于 2020-05-25T07:21:53.653 回答
0

该问题没有明确说明单个字符是否为stror bytes

如果输入是一个实例,则以下答案特别有用bytes: 由于 Python 3.2 有一个类方法int.from_bytes

int.from_bytes(b'\x81', byteorder='big', signed=True)  # -127
int.from_bytes(b'a', byteorder='big', signed=True)  # 97

对于 16 位整数,只需传递 2 个字节而不是 1:

int.from_bytes(b'\x81\x80', byteorder='big', signed=True)  # -32384
int.from_bytes(b'ab', byteorder='big', signed=True)  # 24930

当然,您可能需要指定byteorder='little'.

但是,如果输入是一个 ASCII 字符(0 - 128),我不明白你为什么想要一个有符号整数,因为你输入的结果无论如何都将是正数(如果我没记错的话)。Python 的整数使用灵活的字节数。

于 2021-12-07T16:02:31.917 回答