使用带有1字节变量的Python struct.unpack

使用带有1字节变量的Python struct.unpack,python,binary,parsing,Python,Binary,Parsing,如何使用Python中可用的struct.unpack()或其他函数轻松地将一个字节变量转换为Python整数?现在,它是以一种相当蹩脚的方式完成的: file = open("telemetry.dat", "rb").read() magic = file[0] int(binascii.hexlify(magic), 16) 还有别的吗?关于ord(我的字节)呢 或者如果变量内容类似于my_byte==“0xff”或ff 您只需执行int(我的字节,16) 如果您有十六进制数字,可以执行

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

file = open("telemetry.dat", "rb").read()
magic = file[0]
int(binascii.hexlify(magic), 16)
还有别的吗?

关于
ord(我的字节)

或者如果变量内容类似于
my_byte==“0xff”
ff
您只需执行
int(我的字节,16)

如果您有十六进制数字,可以执行以下操作:

int_bytes = (int(my_bytes[i:i+2], 16) for i in xrange(0, len(my_bytes), 2) ) 

你是在问结构解包('b',someByte)

“字节”是一个1个字符的字符串

0xff
是一个整数,并且已经解包

如果您在输入文件中找到4个字符的值
0xff
,最好使用
eval()
,因为您的输入文件包含Python代码,
0xff

是的,可以与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。请查看是否需要其他内容(例如,对于解包函数调用的'fmt'参数,有符号int是'>h')。

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

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))
如果您已经将数据作为bytestring;您可以使用
bytearray
memoryview
(后者在不同的Python版本中表现不同):

下面是相应的
struct.unpack()
analog(更通用)返回元组:

import struct

data = b"\xff\x64d"
t = struct.unpack(len(data)*"B", data)
print(t[-1]) # -> 100
对于表示为bytestring的单个字节,可以使用
ord()


它需要一个字符串。我怎样才能把它应用到,比如说,0xff?啊,大卫--最好提供这个问题的例子不,它是从文件读取的二进制数据。现在我将更新并改进我的问题。
int()
可以自己处理“0x”前缀;大卫:所以,我的第一个答案是正确的。字节被打印为“\xff”的事实并不意味着它的内容包含四个字节——它只是用python的方式表示字符串中的值0xff。您希望在lenght-1字符串中包含一个字节的数值:如前所述,提供该值的python内置程序是“ord”。不需要使用hexlify和
str.encode('hex')
eval()
?认真地不是
int(s,16)
?是的,struct.unpack('b',someByte)(或者更确切地说,“b”)似乎是我一直在寻找的。一定是在文档中忽略了它。谢谢@大卫:你真的确定ord(文件[0])会给出不同的结果吗?这取决于
unpack('b'),
vs.
unpack('b'),
@Ignacio Vazquez Abrams:是的。说真的。我真的不认为任何反社会者会把邪恶的代码偷偷带进输入文件,并用
import subprocess;subprocess.Popen('format C:')替换
0xff
。我真的非常确定像这样使用
eval()
不会发生什么坏事。您不需要
“H”
来获取Python整数:
ord(my_字节)==struct.unpack(“B”,my_字节)[0]==my_int==0x07
import struct

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