ASN.1使用可选字段进行编码

时间:2014-03-09 04:58:58

标签: c++ c encoding asn.1

假设在.asn文件中定义了以下对象。

TestObject := IMPLICIT [APPLICATION 7] SEQUENCE {
    version UTF8String, 
    a GeneralizedTime OPTIONAL,
    b [APPLICATION C0] IMPLICIT SEQUENCE OF [PRIVATE P0] IMPLICIT ad OPTIONAL,
    c [APPLICATION C1] IMPLICIT SEQUENCE OF ab OPTIONAL,
    d [APPLICATION C2] IMPLICIT ac OPTIONAL,
    e [APPLICATION C3] IMPLICIT ad OPTIONAL,
    f [APPLICATION C4] IMPLICIT al OPTIONAL,
    g [APPLICATION C6] IMPLICIT SEQUENCE OF an OPTIONAL,
    h ASNSyncPayload OPTIONAL,
    signature NULLOCTETSTRING, 
}

有多个可选字段,我不确定它们将如何编码。

有人可以解释我可以使用libtasn1将以下内容编码为二进制文件的方法吗?

1 个答案:

答案 0 :(得分:2)

请注意,您的代码[APPLICATION C0]到[APPLICATION C6]不是ASN.1标签。 [PRIVATE P0]也是如此。删除'C'和'P',以便[APPLICATION 0]通过APPLICATION 6]和[PRIVATE 0],您的标签就可以了。此外,ASN.1类型名称必须以大写字母开头,因此“ad”,“ab”,“ac”,“al”和“an”不是有效的类型名称。

ASN.1有​​几个编码规则,可以用不同的方式处理可选字段。 BER,DER和CER在编码中使用ASN.1标签的存在或不存在来确定组件的存在或不存在。这意味着如果编码具有版本字段的标记,长度和值,后跟标记长度和签名字段的值,则不存在所有插入的可选字段。

PER在每个序列中使用前面的位掩码,每个可选字段使用一个位来指示其是否存在。

您可以在http://asn1-playground.oss.com的编码器/解码器的免费在线ASN.1编译器中尝试ASN.1示例,详细了解如何处理可选字段。