首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混淆BER (基本编码规则)

混淆BER (基本编码规则)
EN

Stack Overflow用户
提问于 2013-08-26 22:11:58
回答 2查看 8.2K关注 0票数 6

我正在努力学习和理解BER (基本编码规则)。

我一直在使用http://asn1-playground.oss.com/网站对不同的ASN.1对象进行实验,并使用误码率对它们进行编码。

然而,即使是最简单的编码似乎也让我感到困惑。

让我们来看一个简单的ASN.1模式:

代码语言:javascript
复制
World-Schema DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN
  Human ::= SEQUENCE {
     name UTF8String
  }
END

因此,基本上这只是一个SEQUENCE,它有一个名为name的UTF8String类型字段。

与此序列匹配的值的示例如下:

代码语言:javascript
复制
{ "Bob" }

因此,使用http://asn1-playground.oss.com/,我生成以下数据的误码率编码:

代码语言:javascript
复制
some-guy Human ::= 
{  
    name "Bob"
}

我希望这会产生一个序列对象,然后是一个字符串对象。

我得到的是:

代码语言:javascript
复制
30 05 80 03 42 6F 62

现在,我理解其中的一些编码。第一个八进制,30,是一个标识符,它告诉我们SEQUENCE类型是第一个对象。30是二进制的00110000,这意味着我们有一个class of 0,一个PC (原语/构造的)位1 (意指构造),以及一个10000 (16小数位)的标记数,意思是SEQUENCE

到目前一切尚好。下一个值是SEQUENCE的长度(以字节为单位),即05

好吧,到目前为止还不错。

但后来..。我是被下一个八重奏80完全搞糊涂了。这是什么意思??我希望值为00001100 (对于标记号12,意思是UTF8String)。

80后面的字节非常简单:03表示长度为3,而42 6F 62只是UTF8String值本身,"Bob"

EN

回答 2

Stack Overflow用户

发布于 2013-08-28 15:35:50

80是一个特定于上下文的标记0。请注意,“自动标签”是使用在模块的开头。这意味着所有序列、集合和选择类型都将为其组件设置上下文特定的标记,每个后续组件将增加1。这样,在创建消息时,特别是在处理可选或具有默认值的组件时,不必担心标记冲突。如果您将“自动”更改为“显式”(我不建议这样做),您将看到编码中期望的通用12。

请注意,自动标记只适用于序列、集或选择组件上的标记。它不适用于顶级组件,这就是为什么您看到了序列的通用16,而不是看到特定于上下文的标记。

票数 9
EN

Stack Overflow用户

发布于 2013-08-27 17:39:38

80表示上下文特定的类、基元、标记号0。这是因为您指定了一个自动标记环境,该环境自动将标记分配给输入Human的字段名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18453894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档