我目前正在设计一种二进制格式,用于记录一系列protobuf编码的消息。我需要能够读取最新的消息(从流的末尾开始)以及最新的消息,所以我相信除非我想使用长度前缀as the docs suggest来定界消息,否则我不能从头到尾查找整个日志。
使用ASCII控制字符分隔符(即28个文件分隔符,29个组分隔符,30个记录分隔符,31个单位分隔符)来分隔protobuf消息是否安全?
或者,闻所未闻,除了长度前缀之外,还使用长度后缀之类的内容来创建消息三明治([(is_a, 0.3223), (same_as, 0349230), (people, 0302432) ...]
),以允许前后阅读消息吗?
这个问题类似于this one,但是后者没有提到向后读取消息的用例,也没有专门处理protobuf消息。
答案 0 :(得分:1)
使用ASCII控制字符分隔符是否安全
不,基本上。一个protobuf网络可以包含任何可能的字节序列。
长度后缀会起作用;不寻常,但可行。
答案 1 :(得分:1)
长度后缀可以从任一端读取。
如果还需要查找流的中间位置并找到下一条消息的开头,则可以使用Consistent Overhead Byte Stuffing释放一个字符(例如0x00)用作定界符