定界二进制序列

Eng*_*eer 15 binary networking binary-data delimiter

我需要能够划分二进制数据流.我正在考虑使用像ASCII EOT(传输结束)字符这样的东西.

但是我有点担心 - 我怎么能确定用于此(0b00000100)的特定二进制序列不会出现在我自己的二进制序列中,从而在分界上给出误报?

换句话说,如何最好地处理二进制分隔?

编辑:...不使用长度标题.对不起,伙计们,之前应该提到这个.

sar*_*old 13

你有五个选择:

  • 使用不太可能发生的分隔符.这会冒你猜错的风险.我不推荐这种方法.
  • 使用分隔符和转义序列来包含分隔符.您可能需要将转义字符加倍,具体取决于更容易解析的内容.(想想C \0在某些内容中包含ASCII NUL.)
  • 使用您可以确定不会发生的分隔符短语.(想想mime消息边界.)
  • 在前面添加某种长度字段,因此您知道将以下N个字节作为数据读取.这有一个缺点,要求您在写入数据之前知道这个长度,这有时很难或不可能.
  • 使用更复杂的东西,如ASN.1,来完整地描述您的所有内容.(我不知道我其实建议,除非你能做出很好的利用它- ASN.1是尴尬在最好的情况下使用,但它允许完全明确的二进制数据的解释.)


TJD*_*TJD 10

通常,您以一种众所周知的格式包装二进制数据,例如使用描述后续数据的固定标头.如果您试图在未知的数据流中找到分隔符,通常需要转义序列.例如,像HDLC,其中0x7E是帧分隔符.必须对数据进行编码,使得如果数据内部存在0x7E,则将其替换为0x7D,然后是原始数据的XOR.类似地转义数据流中的0x7D.

  • 你能解释一下这里的逻辑吗?考虑到选择 0x7E 作为帧分隔符,为什么要用 0x7D 和异或值替换流中的该字节?为什么不简单地替换为 0x7E0x7E?异或值是如何精确计算的?当流包含 0x7D 时会发生什么?您如何区分流中的“自然”值和 0x7E 的替代值? (2认同)