python遍历结构体里的元素_从Python的Struct包中获取整个字符串?

你可以用帕斯卡弦。Pascal字符串的前缀是长度,但标准struct包不支持可变长度的Pascal字符串。

下面是一些我编写的包装函数,它们看起来很有用。

以下是解包助手:def unpack_from(fmt, data, offset = 0):

(byte_order, fmt, args) = (fmt[0], fmt[1:], ()) if fmt and fmt[0] in ('@', '=', '', '!') else ('@', fmt, ())

fmt = filter(None, re.sub("p", "\tp\t", fmt).split('\t'))

for sub_fmt in fmt:

if sub_fmt == 'p':

(str_len,) = struct.unpack_from('B', data, offset)

sub_fmt = str(str_len + 1) + 'p'

sub_size = str_len + 1

else:

sub_fmt = byte_order + sub_fmt

sub_size = struct.calcsize(sub_fmt)

args += struct.unpack_from(sub_fmt, data, offset)

offset += sub_size

return args

这是包装助手:def pack(fmt, *args):

(byte_order, fmt, data) = (fmt[0], fmt[1:], '') if fmt and fmt[0] in ('@', '=', '', '!') else ('@', fmt, '')

fmt = filter(None, re.sub("p", "\tp\t", fmt).split('\t'))

for sub_fmt in fmt:

if sub_fmt == 'p':

(sub_args, args) = ((args[0],), args[1:]) if len(args) > 1 else ((args[0],), [])

sub_fmt = str(len(sub_args[0]) + 1) + 'p'

else:

(sub_args, args) = (args[:len(sub_fmt)], args[len(sub_fmt):])

sub_fmt = byte_order + sub_fmt

data += struct.pack(sub_fmt, *sub_args)

return data

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值