【发布时间】:2021-03-02 03:10:52
【问题描述】:
所以我正在考虑将二进制“消息”写入磁盘。目前我选择在“消息”的开头加上前缀长度,所以我可以很容易地说从流中读取 x 字节然后反序列化它等等。
这是一个特殊情况,我希望能够继续阅读过去的消息,这些消息无法解析和恢复序列中进一步存在的任何消息。
在研究按字节序列分隔二进制数据的方法时,似乎通常不建议这样做(因为序列总是有可能自然地出现在流中),但是对于长度标头前缀,我不确定如何如果您不只是阅读,直到您遇到一些魔术序列然后阅读下一个长度等,您就可以从流中恢复阅读记录。
我正在专门研究 c# 和 protobuf,但它似乎是一个更笼统的话题。
关于如何可靠地用字节序列定界,或从长度与写入磁盘的内容不匹配的损坏数据包中恢复的任何建议?
【问题讨论】:
-
如果您预期“长度可能有误”,您是否不需要同等地预期“分隔符可能有误”并遇到同样的问题?请注意,您可能有一条格式错误的消息,但它的长度仍然正确 - 因此在这种情况下您仍然可以跳过它。我个人建议相信长度并从那里开始。您也可以始终为以长度为前缀的数据包含一个哈希,这样您就可以检测发生了绝对致命的事情,即使您无法超越它。
-
我的意思是那些是有效点,但确定存在的字节是否无效,它找到下一个长度标头的开头等问题并不大。我也没有预料到会发生这种情况但是我们已经看到磁盘流,不完整的写入,然后拾取附加到同一文件的流。永远无法访问新附加的内容,因为数据包错误,并且无法知道下一个标头从哪里获取
标签: c# protocol-buffers