使用python中的struct模块打包和解包可变长度数组/字符串
我正在尝试掌握Python 3中二进制数据的打包和拆包。除了一个问题外,它实际上并不难理解:
如果我有可变长度的文本字符串,并且想要以最优雅的方式打包和解压缩该怎么办?
据我所知,我只能直接解压缩固定大小的字符串吗?在那种情况下,是否有任何优雅的方法来解决此限制,而无需填充很多不必要的零?
-
该
struct
模块仅支持固定长度的结构。对于变长字符串,您可以选择以下任一种:-
动态构造格式字符串(
str
将abytes
传递给之前,必须将其转换为apack()
):s = bytes(s, 'utf-8') # Or other appropriate encoding
struct.pack(“I%ds” % (len(s),), len(s), s)
-
跳过
struct
并仅使用普通的字符串方法将字符串添加到您的pack()
-ed输出中:struct.pack("I", len(s)) + s
要打开包装,您只需要一次打开一些包装:
(i,), data = struct.unpack("I", data[:4]), data[4:] s, data = data[:i], data[i:]
如果您要执行很多操作,则始终可以添加一个
calcsize
用于执行字符串切片的辅助函数:def unpack_helper(fmt, data): size = struct.calcsize(fmt) return struct.unpack(fmt, data[:size]), data[size:]
-