Использование Python struct.unpack с 1-байтовыми переменными - PullRequest
3 голосов
/ 12 января 2010

Как я могу использовать struct.unpack() или другую функцию, доступную в Python, для простого преобразования одной байтовой переменной в целое число Python? Прямо сейчас это делается довольно неубедительно:

file = open("telemetry.dat", "rb").read()
magic = file[0]
int(binascii.hexlify(magic), 16)

Есть еще один?

Ответы [ 4 ]

7 голосов
/ 12 января 2010

как насчет ord(my_byte)?

Или, если переменное содержимое имеет вид my_byte == "0xff" или ff Вы можете просто сделать int(my_byte, 16)

Если у вас есть поток шестнадцатеричных цифр, вы можете сделать:

int_bytes = (int(my_bytes[i:i+2], 16) for i in xrange(0, len(my_bytes), 2) ) 
0 голосов
/ 02 июня 2013

Эффективный способ интерпретировать каждый байт из файла как целое число - это использовать array module:

import os
from array import array

a = array("B") # interpret each byte as unsigned integer [0, 255]
with open("telemetry.dat", "rb") as file:
    a.fromfile(file, os.path.getsize(file.name))

Если у вас уже есть данные в качестве строки байтов; Вы можете использовать bytearray или memoryview (последний ведет себя по-разному в разных версиях Python):

data = b"\xff\x64d"
# a.fromstring(data)
b = bytearray(data)
print(b[0]) # -> 255

Вот соответствующий struct.unpack() аналог (более общий), который возвращает кортеж:

import struct

data = b"\xff\x64d"
t = struct.unpack(len(data)*"B", data)
print(t[-1]) # -> 100

Для одного байта, представленного в виде строки байтов, вы можете использовать ord() , предложенный @ jsbueno :

i = ord(b"d") # -> 100
0 голосов
/ 02 июня 2013

Да, вы можете использовать struct.unpack () с 1-байтовыми переменными; см. пример ниже:

import struct
my_byte = b'\x07';
my_int = struct.unpack('>H', b'\x00' + my_byte)[0]

print type(my_int)
print my_int

В приведенном выше примере предполагается, что ваш int является беззнаковым int. Посмотрите на раздел Формат символов в документации , если вам нужно что-то другое (например, int со знаком, который будет равен «> h» для параметра «fmt» вызова функции unpack).

0 голосов
/ 12 января 2010

Вы спрашиваете о struct.unpack( 'b', someByte )?

«Байт» - это строка из 1 символа.

Значение 0xff является целым числом и уже распаковано.

Если вы найдете 4-символьное значение 0xff во входном файле, вам лучше всего будет eval(), поскольку ваш входной файл содержит код Python, 0xff.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...