我正在尝试掌握ASN.1的概念和编码方案(例如DER),并希望进行一次理智的检查。
到目前为止,我得到的是ASN.1定义了抽象数据类型(整数、布尔等,有些更复杂),它允许您以一种抽象的方式定义数据结构,例如:
World-Schema DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Rocket ::= SEQUENCE
{
range INTEGER, -- huge (see a special directive above)
name UTF8String (SIZE(1..16)),
message UTF8String DEFAULT "Hello World" ,
fuel ENUMERATED {solid, liquid, gas},
speed CHOICE
{
mph INTEGER,
kmph INTEGER
} OPTIONAL,
payload SEQUENCE OF UTF8String
}
END这通过定义"Rocket“的某些字段来定义它的结构。DER作为一种编码方案,只有在我想对一个对象进行编码时才会起作用,也就是这个数据结构的具体值。所以基本上我可以告诉我的计算机:根据这个ASN.1模块,序列化下面的JSON文件:
{
"range":340282366920938463463374607431768211455,
"name":"Falcon",
"fuel":"solid",
"speed":{"mph":18000},
"payload":["Car", "GPS"]
}它将生成符合特定标准的比特流,该标准由DER标准定义。(为施行方式而设X.690)。现在,该比特流的每个接收者(知道它是DER编码的数据)将知道按照ASN.1解释该消息。
我不能对自己解释的一件事是:我们必须定义一个接口吗?我的意思是,一旦我们有了定义数据类型(整数、字符串等)的语言(ASN.1) -人们就可以组装消息,对它们进行编码,然后发送它们,并且它们可以被理解。为什么定义我们之间的接口很重要?
如果我理解错了,请纠正我。
发布于 2021-01-29 06:06:47
ASN.1不是一种语言,它是抽象语法符号的缩写。
ASN.1是一组规范,旨在消除想要相互通信的两个系统之间的所有歧义。
首先,描述将要传输的内容(传输语法)。在你的例子中:一枚火箭有一个射程,一个名字,等等。
然后,您决定如何发送内容(编码规则)。
因为您显示了一个Json值(它是人类可读的),所以您可以认为该值解释了它本身。
但是,如果你采用二进制编码规则(这是ASN.1的本质),你很快就会意识到,你绝对需要知道传输语法(你称之为接口)才能解码一个值。
一些二进制编码规则(如BER、DER、CER)给人的印象是,您可以在不知道规范的情况下使用它们,因为它们遵循标签/长度/值模式……如果你知道如何解码一个标签和一个长度,你可以做一个最小的
但是,当您需要使用压缩编码规则(PER)时,如果没有规范,您将完全无能为力……和好的工具。
https://stackoverflow.com/questions/65942138
复制相似问题