Python:如何从无分隔符分组变长字节串中解析数据?
问题
有如下格式的字节串:
[lenght1][sequence1][len2][seq2][len3][seq3][len1][seq1]...
其中lengthX为紧随其后的sequenceX的长度,所有数据无分隔符,且每三组“长度-数据”为一组循环(seq3后直接是下一组的len1)。
我尝试提取所有序列,但使用struct.unpack()的方式十分繁琐:
loop_start: my_len = unpack("<B", content[:1])[0] content = content[1:] ..get sequence1 ..shift byte-string ..repeat two times...
是否有更简便的实现方式?
注:seqX实际为多字节字符串,此信息可能有用。
解决方案
生成器逐组解析
写一个生成器函数封装解析逻辑,每次输出一组(seq1, seq2, seq3),直到字节串耗尽,主逻辑简洁易读:
import struct def parse_sequences(content): while content: # 解析第一组长度与序列 len1, = struct.unpack("<B", content[:1]) seq1 = content[1:1+len1] content = content[1+len1:] # 解析第二组长度与序列 len2, = struct.unpack("<B", content[:1]) seq2 = content[1:1+len2] content = content[1+len2:] # 解析第三组长度与序列 len3, = struct.unpack("<B", content[:1]) seq3 = content[1:1+len3] content = content[1+len3:] yield (seq1, seq2, seq3) # 使用示例 byte_data = b'\x03abc\x02de\x01f\x02gh\x01i\x04jklm' for group in parse_sequences(byte_data): print(group) # 输出:(b'abc', b'de', b'f'), (b'gh', b'i', b'jklm')
封装单步解析逻辑
把单个“长度-序列”的解析逻辑封装成小函数,进一步减少重复代码:
import struct def parse_single_seq(content): """解析单个[长度-序列]对,返回(序列, 剩余字节串)""" seq_len, = struct.unpack("<B", content[:1]) seq = content[1:1+seq_len] return seq, content[1+seq_len:] def parse_groups(content): while content: seq1, content = parse_single_seq(content) seq2, content = parse_single_seq(content) seq3, content = parse_single_seq(content) yield (seq1, seq2, seq3) # 使用示例与上方一致
批量固定组数解析
如果提前知道循环组数,可以一次性解析所有长度,再批量截取序列(需确保字节串长度完全匹配):
import struct def parse_fixed_groups(content, group_count): # 一次性解析所有长度字段 len_format = "<" + "B"*(3*group_count) lengths = struct.unpack(len_format, content[:3*group_count]) content = content[3*group_count:] groups = [] for i in range(group_count): len1, len2, len3 = lengths[3*i:3*i+3] seq1 = content[:len1] content = content[len1:] seq2 = content[:len2] content = content[len2:] seq3 = content[:len3] content = content[len3:] groups.append((seq1, seq2, seq3)) return groups
以上方法都比手动重复移位字节串的写法更简洁易维护,生成器方式尤其适合处理未知长度的字节流。
内容的提问来源于stack exchange,提问作者Putnik
相关产品推荐
相关产品推荐

