首页 > 解决方案 > c#中长度前缀二进制流的优雅恢复

问题描述

所以我正在考虑将二进制“消息”写入磁盘。目前我选择在“消息”的开头加上前缀长度,所以我可以很容易地说从流中读取 x 字节然后反序列化它等等。

这是一个特殊情况,我希望能够继续阅读过去的消息,这些消息无法解析和恢复序列中进一步存在的任何消息。

在研究按字节序列分隔二进制数据的方法时,似乎通常不建议这样做(因为序列总是有可能在流中自然发生),但是有长度头前缀,我不确定你怎么能如果您不只是在读取某个魔术序列然后读取下一个长度等之前,则从流中恢复读取记录。

我正在专门研究 c# 和 protobuf,但它似乎是一个更笼统的话题。

关于如何可靠地用字节序列定界或从长度与写入磁盘的内容不匹配的损坏数据包中恢复的任何建议?

标签: c#protocol-buffers

解决方案


所有音频格式都使用帧同步(您的魔术序列)+ 长度标头 + CRC 检查,因此音频解码器可以从损坏的流中恢复。您应该在 protobuf 反序列化器之前执行相同的操作。

MP3 https://checkmate.gissen.nl/headers.php

奥格https://en.wikipedia.org/wiki/Ogg_page


推荐阅读