首页 > 解决方案 > 支持 python 的 struct.pack_into 中的新格式字符

问题描述

我有一个 pythonstruct格式字符串,我想将其拆分为多个调用struct.pack_into,如下所示:

buff = bytearray()
fmt = "!BBi4sVi3s"
args = [1, 0, 4, "abcd", 6, 3, "abc"]
offset = 0
fmt_parts = fmt.split("V")
for fmt_part in fmt_parts:
    struct.pack_into(fmt_part, buff, offset, *args)
    offset += struct.calcsize(fmt_part)

这是行不通的,因为args每次循环都会完整地传递列表,尽管每次调用只会关心该列表的子列表。

args给定一个格式字符串,有没有办法准确计算出调用使用该格式字符串时将消耗列表中的多少参数struct.pack_into解决方案尽可能高效也很重要。

我试过这样的东西

# every format char that doesn't consume an arg, per the struct docs
NOARG_STRUCT_FMTS = re.compile(r'[^xcbB\?hHiIlLqQfdspP]')
stripped_fmt_part = re.sub(NOARG_STRUCT_FMTS, '', fmt_part)
part_args = [args.pop(0) for _ in range(len(stripped_fmt_part))]

但这种方法可能不可靠或比最优方法慢。

附加上下文:我正在尝试将自定义格式字符添加Vstruct.pack_into导致参数编码为varint. 我知道存在varint编码/解码的现有 python 实现,但我想制作自己的与 定义的接口兼容的接口struct.pack_into,我在社区中没有见过。

标签: pythonstructencodingbinaryprotocol-buffers

解决方案


推荐阅读