首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python结构解包

python结构解包
EN

Stack Overflow用户
提问于 2011-05-01 23:04:51
回答 3查看 1.8K关注 0票数 1

我正在尝试转换以下perl代码:

代码语言:javascript
复制
unpack(.., "Z*")

然而,对于python来说,struct.unpack()中缺少"*“格式修饰符似乎使得这一点变得不可能。有没有办法在python中做到这一点?

附注: perl中的"*“修饰符来自perldoc -为重复计数提供一个*,而不是一个数字,意思是使用剩下多少项,...

因此,尽管python像perl一样有数字重复计数,但它似乎缺少*重复计数。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-01 23:16:03

python的struct.unpack没有Z格式

代码语言:javascript
复制
Z  A null-terminated (ASCIZ) string, will be null padded.

我想这是

代码语言:javascript
复制
unpack(.., "Z*")

将是:

代码语言:javascript
复制
data.split('\x00')

尽管这会去掉空值

票数 3
EN

Stack Overflow用户

发布于 2011-05-01 23:42:52

我假设您创建了struct数据类型,并且您知道结构的大小。如果是这种情况,那么您可以创建一个为该结构分配的缓冲区,并将值打包到缓冲区中。在解包时,您可以使用相同的缓冲区直接解包,只需指定起始点。

例如

代码语言:javascript
复制
import ctypes
import struct
s = struct.Struct('I')
b = ctypes.create_string_buffer(s.size)
s.pack_into(b, 0, 42)
s.unpack_from(b, 0)
票数 2
EN

Stack Overflow用户

发布于 2011-05-01 23:13:11

您必须自己计算重复次数:

代码语言:javascript
复制
n = len(s) / struct.calcsize(your_fmt_string)
f = '%d%s' % (n, your_fmt_string)
data = struct.unpack(s, f)

我假设your_fmt_string不会解包一个以上的元素,并且len(s)完全除以该元素的打包大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5849167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档