在Python中使用struct.unpack处理1字节变量

5 投票
4 回答
16504 浏览
提问于 2025-04-15 17:56

我该如何使用 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))

如果你已经有了字节串的数据,可以使用 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(),这是 @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) ) 

撰写回答