You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:13:14