当前位置: 首页 > 面试题库 >

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

严昊昊
2023-03-14
问题内容

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

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

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


问题答案:

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


 类似资料:
  • 我一直在试图弄清楚Pack/Unpack的PHP实现是否能够完成Perl版本所能做到的事情。我希望能够在PHP中执行的示例是: http://perldoc.perl.org/perlpacktut.html#String-长度 此Perl代码的作用如下所述: 将两个包代码与斜杠(/)组合将它们与参数列表中的单个值关联。在pack中,参数的长度是根据第一个代码获取和打包的,而参数本身是在斜杠后用模

  • 本文向大家介绍python 用struct模块解决黏包问题,包括了python 用struct模块解决黏包问题的使用技巧和注意事项,需要的朋友参考一下 为什么会出现黏包现象:   首先只有在TCP协议中才会出现黏包现象,是因为TCP协议是面向流的协议,在发送的数据传输的过程中还有缓存机制来避免数据丢失,因此,在连续发送小数据的时候,以及接收大小不符的时候容易出现黏包现象。本质还是因为我们在接收数据

  • 问题内容: 我正在用Java解析具有以下规范的字节数组: 今天,我没有看到任何解决方案来解析此数组以获取具有正确类型的7变量。您是否确认或者我是否缺少Java中的魔术函数之类的东西,该函数允许在字节数组中查找字符串“限制”(我看不出如何将Minimum value与相关的ASCII字符区分开)。 两个字符串之间是否有关于特殊字符的“约定”? 问题答案: 好吧,您知道名字从字节9开始,姓氏在字节结尾

  • 本文向大家介绍Python struct模块解析,包括了Python struct模块解析的使用技巧和注意事项,需要的朋友参考一下 python提供了一个struct模块来提供转换。下面就介绍这个模块中的几个方法。     struct.pack(): struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,

  • 本文向大家介绍Python中的包和模块实例,包括了Python中的包和模块实例的使用技巧和注意事项,需要的朋友参考一下 一、实例和结果 1)实例的结构和具体的文件: 2)PyCommonM.py 3) P1M.py: 4)P1MC.py: 5)P2M.py: 6) P2.py: 7) 运行p2.py的结果: 二、解释 *  一个py文件为一个module,例如module: PyCommonM.p

  • 我希望用户首先选择要键入的单词数,然后将单词数相加(例如Hello and bye=5 3=所有行的总长度为8),但我不知道如何将数组中的所有元素相加。 我的代码: 谢谢你的帮助