使用带有1字节变量的Python struct.unpack
如何使用Python中可用的使用带有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) 如果您有十六进制数字,可以执行
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