【问题标题】:How can I use encapsulated a structure in asn1c? (using CONTAINING )如何在 asn1c 中使用封装的结构? (使用包含)
【发布时间】:2017-10-12 12:58:14
【问题描述】:

我想在 asn1c (http://lionet.info/asn1c/blog/) 中使用 CONTAINING。我不知道如何为 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
} )

任何建议表示赞赏。

【问题讨论】:

    标签: c asn.1


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多