使用Protobuf解析OnlineSequencer二进制文件仅返回文件大小问题
问题原因
Protobuf的Python API中,ParseFromString()方法的返回值本身就是成功解析的字节数,而非解析后的消息对象。解析得到的所有数据会直接填充到调用该方法的实例(即你代码中的sequence对象)中,你目前的代码刚好只打印了这个返回值,所以只会输出文件大小。
同时你当前代码还存在两个无意义操作:
- 打印了尚未读取任何数据的空文件对象
f - 打印了还未执行解析的空
sequence实例
修正后的代码
import sequence_pb2 # 使用with上下文管理器自动处理文件关闭,避免资源泄露 with open('./test.sequence', 'rb') as f: binary_data = f.read() sequence = sequence_pb2.Sequence() # 解析数据,返回值为解析的字节数 parsed_size = sequence.ParseFromString(binary_data) print(f"解析完成,共读取{parsed_size}字节数据") # 打印完整的解析结果 print("序列内容如下:") print(sequence) # 也可以直接读取指定字段 print(f"\n序列BPM:{sequence.settings.bpm}") print(f"音符总数量:{len(sequence.notes)}")
异常排查说明
如果执行修正后代码仍然没有输出预期的序列内容,可按以下顺序排查:
- 确认你本地安装的
protobuf库版本,和编译.proto文件所用的protoc版本一致,版本不兼容会导致静默解析失败 - 确认
test.sequence没有额外的文件头、加密、压缩等处理,内容是标准的Sequence结构Protobuf序列化二进制数据
内容的提问来源于stack exchange,提问作者ashduino101
相关产品推荐
相关产品推荐

