在 BER 和 DER 编码规则中,每个数据元素都被编码为一个标签-长度-值序列。
当讨论非构建类型(例如 INTEGER 或 IA5String)时,值是按照该类型的规则编码的实际值。
当谈论构建类型(例如 SEQUENCE 或 SET)时,值是包含在构建类型中的不同字段的 BER/DER 编码值。
有了这个理解,我们可以看看您的类型。
User::=SEQUENCE {
userid [0] IA5String,
password [1] IMPLICIT IA5String}
以及您的数据价值
{userid = "user", password = "pass"}
我们可以开始对文本进行编码。
首先是 SEQUENCE 标签,它的十六进制值是 0x30,然后是长度,我们还不知道长度。现在我们需要对构造的 SEQUENCE 进行编码。所以我们开始对不同的字段进行编码。
我们需要对
userid
字段进行编码。这是一个标记类型,这里取决于全局的
EXPLICIT
或
IMPLICIT
选项,它可能是构建或非构建的:
- 如果是 EXPLICIT,则会有标记为 0xA0 的标签(用于构建上下文 0),然后是长度和标记类型:IA5String 是标签 0x16(UNIVERSAL 22),其长度为 0x04,其值为 0x75 73 65 72
- 如果是 IMPLICIT,则会有标记为 0x80 的标签(用于非构建上下文 0),长度为 0x04,值为 75 73 65 72
最后,我们需要对密码进行编码,在这种情况下,我们没有疑问,添加 IMPLICIT 关键字以强制隐式标记。因此,我们将具有标记为 0x81(用于非构建上下文 1),长度为 0x04,值为 70 61 73 73。
因此,总结一下(假设全局 IMPLICIT):
30 0c
80 04 75 73 65 72
81 04 70 61 73 73
总计14字节
或者如果是全局EXPLICIT
30 0e
A0 06
16 04 75 73 65 72
81 04 70 61 73 73
总共有16个字节