如何在asn1c中使用封装的结构? (使用CONTAINING)

时间:2017-10-12 12:58:14

标签: c asn.1

我想在asn1c(http://lionet.info/asn1c/blog/)中使用CONTAINING。我不知道如何为包含结构赋予价值。

在我的例子中,我想在Octasd SEQUENCE中为版本和tsapolicy提供值。我想我可以像任何其他asn1类型那样做。

其他类型,例如INTGER,您可以使用函数来赋值。 我可以使用asn_long2INTEGER函数给出contentType值:

 EncapsulatedContentInfo_t *encapcontinfo;
 asn_long2INTEGER(&encapcontinfo->contentType, 32);

在代码中,例如:EncapsulatedContentInfo-> eContent.octasd.version 但我不会在octasd后面“看到”。

有没有办法达到封装结构?

我的asn1的一部分:

EncapsulatedContentInfo ::= SEQUENCE {
  contentType INTEGER,
  eContent [0] IMPLICIT SEQUENCE {
       octasd Octasd
  }
}

Octasd ::= OCTET STRING (CONTAINING SEQUENCE {
   version INTEGER,
   tsapolicy OBJECT IDENTIFIER
} )

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

Lev Walkin的编译器似乎不支持CONTAINING子句的代码生成(至少不支持嵌入式代码)。不过,我对它不是很熟悉。

如果您真的需要使用CONTAINING关键字,您可能会考虑做的是分隔类型,例如:

Octasd ::= OCTET STRING -- (CONTAINING OctasdSeq)

OctasdSeq ::= SEQEUENCE {
   version    INTEGER,
   tsapolicy  OBJECT IDENTIFIER
}

这可能会将Octasd视为一个简单的八位字符串,并将其字节(值字节,无论如何)传递给OctasdSeq的解码器。我猜这可能会因为潜在的对齐问题而使用PER而不是BER / CER / DER会有点困难。