使用Python struct.unpack和1字节变量

时间:2010-01-12 17:45:20

标签: python binary parsing

如何使用struct.unpack()或Python中的其他一些功能轻松将一个字节变量转换为Python整数?现在,它以一种相当蹩脚的方式完成:

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

还有另一个吗?

4 个答案:

答案 0 :(得分:7)

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) ) 

答案 1 :(得分:0)

是的,您可以将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是unsigned int。如果您需要不同的东西,请查看Format Characters section of the documentation(例如,签名的int,对于解包函数调用的'fmt'参数,它将是'> h'。)

答案 2 :(得分:0)

将文件中的每个字节解释为整数的有效方法是使用array模块:

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))

如果您已将数据作为字节串;您可以使用bytearraymemoryview(后者在不同的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() suggested by @jsbueno

i = ord(b"d") # -> 100

答案 3 :(得分:-7)

您是在询问struct.unpack( 'b', someByte )吗?

“byte”是1个字符的字符串。

0xff是一个整数,并且已经解压缩。

如果您在输入文件中找到4个字符的值0xff,那么您最好由eval()提供服务,因为您的输入文件包含Python代码0xff