在https://www.itu.int/rec/T-REC-X.680-202102-I/en中解释了EXPLICIT
构造在https://www.itu.int/rec/T-REC-X.690-202102-I/en中解释
注意:constructed 仅用于描述编码,没有构造类型。
constructed encoding:一种数据值编码,其中的内容
八位位组是一个或多个数据值的完整编码
在标签/长度/值编码(如 ASN.1 BER、CER、DER)中,值可以是叶或节点。
如果Value是叶子,则Tag的构造位为假
如果Value是一个节点(意味着Value实际上是另一个Tag/Lenght/Value),Tag的构造位为真
您可以在 2 种情况下发现构造位设置为 true(参见下面的示例):
- 您使用了显式标记
- 您的价值类型强加或允许将价值分成几部分(然后,每部分都有自己的标签/长度
显式标记
Schema DEFINITIONS ::=
BEGIN
My-Integer1 ::= [0] EXPLICIT INTEGER -- TLTLV where first T is constructed
My-Integer2 ::= [1] IMPLICIT INTEGER -- TLV
END
如果您使用 My-Integer1 编码发送 1(整数值)将是 A003 0201 01 (TLTLV)
如果您使用 My-Integer2 编码发送 1(整数值)将是 8101 02 (TLV)
可以分解成部分的值:
一个明显的例子是 SEQUENCE OF...
Schema DEFINITIONS ::=
BEGIN
My-SEQUENCE ::= SEQUENCE OF INTEGER
END
如果您发送一个包含 3 个整数 (1,2,3) 的列表,则会构造第一个标签
OSS ASN-1Step Version 10.2
Copyright (C) 2021 OSS Nokalva, Inc. All rights reserved.
This product is licensed for use by "OSS Nokalva, Inc."
C0043I: 0 error messages, 0 warning messages and 0 informatory messages issued.
ASN1STEP: Encoding of value notation for PDU #1:
Encoding to the file 'data.ber' using BER encoding rule...
My-SEQUENCE SEQUENCE OF: tag = [UNIVERSAL 16] constructed; length = 9
INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
1
INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
2
INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
3
Encoded successfully in 11 bytes:
30090201 01020102 020103
一个不太明显的例子是一个字符串(因为它可能很长,所以可以分成几部分)。请参阅 x690 规范中的示例 8.23.5.4
Name ::= VisibleString
“Jones”的值可以用 3 种不同的方式编码:
-
1A 05 4A6F6E6573(标签1A是原始形式)
-
3A 09 04034A6F6E1 04026573(标签 3A 构造形式:“Jones”分为 2 部分“Jon”和“es”)
-
3A 80 04034A6F6E1 04026573 0000(与2相同。但我们不知道总长度......我们只希望0000结束)