使用python中的struct模块打包和解包可变长度数组/字符串

发布于 2021-01-29 18:28:20

我正在尝试掌握Python 3中二进制数据的打包和拆包。除了一个问题外,它实际上并不难理解:

如果我有可变长度的文本字符串,并且想要以最优雅的方式打包和解压缩该怎么办?

据我所知,我只能直接解压缩固定大小的字符串吗?在那种情况下,是否有任何优雅的方法来解决此限制,而无需填充很多不必要的零?

关注者
0
被浏览
164
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    struct模块仅支持固定长度的结构。对于变长字符串,您可以选择以下任一种:

    • 动态构造格式字符串(str将abytes传递给之前,必须将其转换为a pack()):

      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:]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看