如何在BER中以无限长度编码的八位字节字符串中转义双零八位字节?

时间:2017-10-12 12:34:39

标签: asn.1 ber

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

1 个答案:

答案 0 :(得分:3)

您永远不会将简单的OCTET STRING内容放在0x80和0x00 0x00之间。相反,你把[可能的部分]定长编码的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标记的实际有效载荷,因为有效载荷余量由定长编码片段明确定义。