在Python中使用struct.unpack处理1字节变量
我该如何使用 struct.unpack()
或者其他在Python中可用的函数,轻松地把一个字节变量转换成Python的整数呢?现在我用的方法有点笨:
file = open("telemetry.dat", "rb").read()
magic = file[0]
int(binascii.hexlify(magic), 16)
有没有其他更好的方法呢?
4 个回答
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))
如果你已经有了字节串的数据,可以使用 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
是的,你可以使用 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
上面的例子假设你的整数是一个无符号整数。如果你需要其他类型的整数(比如有符号整数),可以查看 文档中的格式字符部分,在这里你会找到相应的格式,比如有符号整数在调用unpack函数时的'fmt'参数应该用'>h'。
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) )