在 Python 结构体中打包整数后,即使它只包含一个项目,解包的结果也是一个元组。为什么解包会返回一个元组?
>>> x = struct.pack(">i",1)
>>> str(x)
'\x00\x00\x00\x01'
>>> y = struct.unpack(">i",x)
>>> y
(1,)
请先查看文档 struct 文档
struct.pack(fmt, v1, v2, ...)
根据给定的格式,将 v1、v2 等值打包为一个字符串返回。参数必须与格式所需的值完全匹配。
--
struct.unpack(fmt, string)
按照给定的格式解包字符串(可能是通过 pack(fmt, ...) 打包的)。即使结果只包含一个元素,结果也是一个元组。字符串必须恰好包含格式所需的数据量(len(string) 必须等于 calcsize(fmt))。
因为 struct.pack
定义为 struct.pack(fmt, v1, v2, ...)
,它接受一个非关键字的参数列表 (v1, v2, ...
, 也就是 *args
),所以 struct.unpack
需要返回一个类似于列表的对象,这就是为什么返回元组。
如果你将 pack 视为
x = struct.pack(fmt, *args)
args = struct.unpack(fmt, x) # return *args
例子:
>>> x = struct.pack(">i", 1)
>>> struct.unpack(">i", x)
(1,)
>>> x = struct.pack(">iii", 1, 2, 3)
>>> struct.unpack(">iii", x)
(1, 2, 3)
考虑一个使用C语言编写的二进制数据加载的用例。Python无法区分是使用结构体还是单个整数写入的二进制数据。因此,我认为逻辑上总是返回元组是有意义的,因为struct pack和unpack可以在Python值和C结构之间执行转换。
int.from_bytes
和int.to_bytes
。 - mgilson