gpt4 book ai didi

encoding - 对 BER(基本编码规则)感到困惑

转载 作者:行者123 更新时间:2023-12-03 15:59:35 25 4
gpt4 key购买 nike

我正在尝试学习和理解 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 的标识符type 是第一个对象。 3000110000在二进制中,这意味着我们有一个 class01 的 PC(原始/构造)位(意思是构造),标签号 10000 (十进制为 16)表示 SEQUENCE
到现在为止还挺好。下一个值是 SEQUENCE 的字节长度。 ,即 05 .

好吧,到目前为止还是那么好。

但是……我是 完全糊涂了由下一个八位字节 80 .这意味着什么???我本来期望值为 00001100(对于标签号 12,表示 UTF8String。)
80 之后的字节非常简单: 03表示长度为 3, 42 6F 62只是 UTF8String 值本身, "Bob"

最佳答案

80 是特定于上下文的标记 0。请注意,在模块的开头使用了“自动标记”。这表明所有 SEQUENCE、SET 和 CHOICE 类型的组件都将具有特定于上下文的标签,这些标签从 [0] 开始,并为每个后续组件递增 1。这样,您在创建消息时不必担心标签冲突,尤其是在处理可选或具有默认值的组件时。如果您将“AUTOMATIC”更改为“EXPLICIT”(我不建议这样做),您将看到您在编码中所期望的 [UNIVERSAL 12]。

请注意,AUTOMATIC TAGS 仅适用于 SEQUENCE、SET 或 CHOICE 组件上的标签。它不适用于顶级组件,这就是为什么您看到 SEQUENCE 的 [UNIVERSAL 16] 而不是在那里也看到特定于上下文的标签。

关于encoding - 对 BER(基本编码规则)感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com