如何分隔一系列协议缓冲区消息,以便可以向后和向前读取它们?

How do I delimit a sequence of protocol buffer messages so that they can be read both backwards and forwards?

我目前正在设计一种二进制格式来记录一系列 protobuf 编码消息。我需要能够读取最新到最旧(从流的末尾)以及最旧到最新的消息,所以我相信我不能使用长度前缀 as the docs suggest 来分隔消息,除非我想从头到尾查找整个日志。

使用 ASCII 控制字符分隔符(即 28 位文件分隔符、29 位组分隔符、30 位记录分隔符、31 位单位分隔符)来分隔 protobuf 消息是否安全?

或者,除了长度前缀之外还使用长度后缀之类的东西来创建消息三明治 (length message length) 以允许向前和向后阅读消息,这是否闻所未闻?

这个问题和this one类似,但是后者没有提到反向读取消息的用例,也没有具体处理protobuf消息。

Is it safe to use ASCII control character separators

基本上没有。 protobuf-net 可以包含任何可以想到的字节序列。

长度后缀可以;不寻常,但可行。

长度后缀适用于从两端读取。

如果您还需要能够搜索到流的中间并找到下一条消息的开始,您可以使用 Consistent Overhead Byte Stuffing 释放一个字符,例如 0x00,用作一个分隔符。