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