如何在 BER 中以不确定长度编码的八位字节字符串中转义双空八位字节?

How do you escape double null octets within an octet string encoded with indefinite length in BER?

我正在尝试用 D 编写一个基本编码规则编解码器,我希望能够使用不定长度编码对数据进行编码,其中长度字节设置为 0x80 并且结束值字节用双空 0x00 0x00(内容结束)划界。但是,有时双空值是被编码的实际值的一部分。例如,如果你有一个 OCTET STRING,两个相邻的字节可能是 0x00 0x00,这将被解释为 END OF CONTENT,而不仅仅是编码值的一部分,导致截断编码值(最佳情况)。有没有什么方法可以对双空值进行编码而不会将它们解释为 END OF CONTENT?或者您是否希望只对没有双空值的值进行编码?我还没有在任何规范中找到关于此的任何内容。

您永远不会将纯 OCTET STRING 内容放在 0x80 和 0x00 0x00 之间。取而代之的是,您将 [likely pieces] 定长编码的 OCTET STRING 放在那里。

换句话说,无限长度编码,单八位字节分块 "AB" ASCII 字符串(例如十六进制的 0x41 0x42)看起来像这样:

0x24 0x80      0x04 0x01 0x41       0x04 0x1 0x42     0x00 0x00 
^              ^                    ^                 ^
outer header   inner chunk #1       inner chunk #2    outer EOO sentinel

最终结果是解码器不必扫描实际有效载荷来搜索 EOO 标记,因为有效载荷余量由确定长度的编码片段明确定义。