在 C++ 中表示 asn 结构
Representing asn structs in c++
我有一个 asn 模式文件,但在表示两种类型的数据时遇到了问题
id TID
其中 TID::= OCTET STRING (SIZE(4))
如何设置id
的值?如果是类型INTEGER
,我们直接设置id = 10
例如
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
}
lat
和 long
可以通过 refPos.lat
和 refPos.Long
访问。但是因为 data
是一个 List
,它是一个大小为 256 的序列,而这 256 个项目中的每一个都有一个 objData1
和 objData2
。是否涉及索引?因此,访问列表中第一项的 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
我有一个 asn 模式文件,但在表示两种类型的数据时遇到了问题
id TID
其中TID::= OCTET STRING (SIZE(4))
如何设置id
的值?如果是类型INTEGER
,我们直接设置id = 10
例如
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
}
lat
和 long
可以通过 refPos.lat
和 refPos.Long
访问。但是因为 data
是一个 List
,它是一个大小为 256 的序列,而这 256 个项目中的每一个都有一个 objData1
和 objData2
。是否涉及索引?因此,访问列表中第一项的 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