2013-06-12 3 views
4

Это чувствует, как это должно быть очень просто, но я не смог найти ответ ..Преобразование ASCII символов в знаковое 8-битовое целое питона

В питон скрипт я читал в данных, полученных USB-устройство (движения x и y мыши USB). он прибывает в одиночные символы ASCII. Я могу легко преобразовать в целые числа без знака (0-255), используя ord. Но я бы хотел, чтобы это было как целые числа (от -128 до 127) - как я могу это сделать?

Любая помощь очень ценится! Большое спасибо.

ответ

4

Вычесть 256, если в течение 127:

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] 
0
from ctypes import c_int8 
value = c_int8(191).value 

использовать ctypes с ваше значение ord() должно быть -65 в этом случае

ex. из данных строки

from ctypes import c_int8 
data ='BF' 
value1 = int(data, 16) # or ord(data.decode('hex')) 
value2 = c_int8(value1).value 

value1 является 16bit целого представлением шестнадцатеричной «BF» и value2 является 8bit представления

0

Я знаю, что это старый вопрос, но я не нашел удовлетворительный ответ в другом месте.

Вы можете использовать модуль массива (с дополнительным удобством, что она преобразует полные буфера):

from array import array 

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

# result: array('b', [0, 1, -1, -2]) 
0

Используйте эту функцию, чтобы получить подписанный 8BIT целочисленного значения

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