【发布时间】:2013-08-29 12:27:47
【问题描述】:
我正在努力学习和理解 BER(基本编码规则)。
我一直在使用网站 http://asn1-playground.oss.com/ 来试验不同的 ASN.1 对象并使用 BER 对其进行编码。
然而,即使是最简单的编码似乎也让我感到困惑。
让我们看一个简单的 ASN.1 架构:
World-Schema DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Human ::= SEQUENCE {
name UTF8String
}
END
所以基本上这只是一个 SEQUENCE,带有一个名为 name 的单个 UTF8String 类型字段。
与此序列匹配的值的示例如下:
{ "Bob" }
所以,使用http://asn1-playground.oss.com/,我生成以下数据的BER编码:
some-guy Human ::=
{
name "Bob"
}
我希望这会产生一个序列对象,然后是一个字符串对象。
我得到的是:
30 05 80 03 42 6F 62
现在,我了解了这种编码的一些。第一个八位字节30 是标识符,它告诉我们SEQUENCE 类型是第一个对象。 30 在二进制中是00110000,这意味着我们有一个class 的0,一个PC(原始/构造)位1(意思是构造)和一个标签号10000 (十进制的 16)表示SEQUENCE
到目前为止一切顺利。下一个值是SEQUENCE 的字节长度,即05。
好的,到目前为止还不错。
但是……我对下一个八位字节 80完全困惑。那是什么意思???我本来期望值为 00001100(对于标记号 12,表示 UTF8String。)
80 后面的字节非常简单:03 表示长度为 3,42 6F 62 只是 UTF8String 值本身,"Bob"
【问题讨论】: