"Image": {
"Width": 800,
"Height": 600,
"Title": "View from 15th Floor"
}
Image ::= SEQUENCE {
Width INTEGER,
Height INTEGER,
Title UTF8String
}
Image ::= SEQUENCE {
Width INTEGER OPTIONAL,
Height INTEGER OPTIONAL,
Title UTF8String
}
INTEGER(750), UTF8String("A funny kitten")
750是什么?宽度还是高度?可能是宽度(且缺少高度),也可能是高度(且缺少宽度),在二进制流中两者看起来相同。在JSON中,每个数据块都有名称,因此很清晰,但在ASN.1中则不然。现在仅有类型已经不够了,我们还需要一个名称。这就是非通用标签的作用。将其更改为:
Image ::= SEQUENCE {
Width [0] INTEGER OPTIONAL,
Height [1] INTEGER OPTIONAL,
Title UTF8String
}
如果您收到以下数据:
[1]INTEGER(750), UTF8String("A funny kitten")
[1]INTEGER(xxx), UTF8String(yyy)
Length ::= [0] INTEGER
可以被更改为
Length ::= [0] CHOICE {
integer INTEGER,
real REAL
}
标记[0]仍然表示长度,但现在长度可以是整数或浮点值。由于类型被显式编码,解码器将始终知道如何正确解码该值,因此这种更改在向前和向后兼容(至少在解码器级别上是向后兼容的,不一定在应用程序级别上是向后兼容的)。
如果标记是隐式的,则数据将被发送为:
[1](xxx), UTF8String(yyy)
Image ::= SEQUENCE {
Width INTEGER,
Height INTEGER,
Title UTF8String
}
显式可选项
值:Image ::= SEQUENCE {
Width [0] EXPLICIT INTEGER OPTIONAL,
Height [1] EXPLICIT INTEGER OPTIONAL,
Title UTF8String
}
编码序列可能是:
30 15 A1 02 02 02 EE 0C 0E 41 20 66 75 6E 6E 79 20 6B 69 74 74 65 6E
(21个字节)而内部序列分解为:
A1
02
02
02 EE
750 (2个字节)0C
0E
41 20 66 75 6E 6E 79 20 6B 69 74 74 65 6E
"一个有趣的小猫" (14个字节)(注:其中“Original Answer”无需翻译,因为它是英文)