代码之家  ›  专栏  ›  技术社区  ›  Ronnyek

c语言中长度前缀二进制流的优雅恢复#

  •  0
  • Ronnyek  · 技术社区  · 4 年前

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

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

    在研究按字节序列分隔二进制数据的方法时,似乎通常不建议这样做(因为序列在流中自然出现的可能性总是存在的),但如果使用长度标头前缀,我不确定如果你不只是读取,直到遇到某个神奇的序列,然后读取下一个长度等,你怎么能从流中恢复读取记录。

    我专门研究c#和protobuf,但这似乎是一个更一般的话题。

    有什么建议可以让我用字节序列可靠地分隔,或者从长度与写入磁盘的长度不匹配的损坏数据包中恢复吗?

    0 回复  |  直到 4 年前
        1
  •  0
  •   Stig    4 年前

    所有音频格式都使用帧同步(您的魔术序列)+长度报头+CRC校验,因此音频解码器可以从中断的流中恢复。在protobuf反序列化器之前,您也应该这样做。

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

    Ogg https://en.wikipedia.org/wiki/Ogg_page