支持python的struct.pack_into中的新格式字符

时间:2018-07-26 19:10:51

标签: python struct encoding binary protocol-buffers

我有一个python struct格式的字符串,我想将它分成多个对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))]

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

其他上下文:我正在尝试将自定义格式字符V添加到struct.pack_into的功能中,以使参数被编码为varint。我知道已经有varint编码/解码的python实现,但是我想使自己的与struct.pack_into定义的接口兼容,我没有在社区。

0 个答案:

没有答案