在 C++ 中表示 asn 结构

Representing asn structs in c++

我有一个 asn 模式文件,但在表示两种类型的数据时遇到了问题

  1. id TID 其中 TID::= OCTET STRING (SIZE(4))

如何设置id的值?如果是类型INTEGER,我们直接设置id = 10例如

  1. objects List 其中 List::= SEQUENCE (SIZE(1..256)) OF Data ,
Data::= SEQUENCE {
    cl1 objData1,
    cl2 objData2
    }

,

objData1::= SEQUENCE {
    cl3 objData3,
    cl4 objData4,
    }

我的问题是,当我在对应于 objects 创建的结构中引用变量时,我该怎么做?例如,在更简单的情况下,refPos Position3D

Position ::= SEQUENCE {
    lat        Latitude,                
    Long       Longitude
    }

latlong 可以通过 refPos.latrefPos.Long 访问。但是因为 data 是一个 List,它是一个大小为 256 的序列,而这 256 个项目中的每一个都有一个 objData1objData2。是否涉及索引?因此,访问列表中第一项的 latitude 完成为 objects[1].cl1.cl3.lat ?

如果您查看 Lev Walkin 的 asn1c 编译器生成的代码,您会发现您的 TID 以包含指向 uint8_t 数组的指针和长度的形式出现。分配一个4长的数组,根据需要填写字节,长度设置为4。

因为您已将其定义为 OCTET STRING (SIZE(4)),所以如何将其初始化为“10”取决于具体情况。您将字节填充为 0x00、0x00、0x00、0x0a。或者同样,0x0a、0x00、0x00、0x00。

我的想法是,您确实希望 TID 是一个 4 字节长的整数。在这种情况下,您最好定义一个 INTEGER (0..4294967295)。这将在任何平台(Java 除外)上作为 uint32_t 呈现/生成,您只需在代码中为其分配 10。

如果 TID 确实应该是一个整数值,那么最好这样做的原因是您随后可以消除任何字节顺序歧义。用于模拟整数的 OCTET STRING (SIZE(4)) 不明确。

2.

列表作为一个结构生成,该结构包含指向指针数组的指针、计数、分配的大小以及可用于释放列表中对象的函数。您必须分配一个指针数组 Data* 256 长,然后分配单个数据并将它们放入该数组。该数组是可索引的:

List list;

//allocate array in list
//allocate a Data, put the pointer to it into list.array at some index

// populate the latest entry
list.array[i]->cl1 = ...

// set the length fields