【问题标题】:Representing asn structs in c++在 C++ 中表示 asn 结构
【发布时间】:2021-09-16 11:12:45
【问题描述】:

我有一个 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 完成的?

【问题讨论】:

  • How do I set the value of id? 这不是 C++,你可以随意设置它,在你选择使用的任何抽象中。 If it was type INTEGER, we directly set id = 10 C++ 中没有 INTEGER。如果是 C++ 并且是 int,那么您可以使用 id = 10。但同样的方式,如果它是 c++ 并且如果它是 std::string,那么你会是 id = "stri"。我不清楚你在问什么。
  • when I am referencing the variables inside the struct created corresponding to objects, how do I do that?你“参考”在什么地方?在英语中,你可以说你的意思是一个对象列表。在 C++ 中,你必须先用 C++ 编写它......the lat and long can be accessed by refPos.lat and refPos.Long 用什么语言? Position ::= 不是 C++,你不能在 C++ 中访问它。
  • @KamilCuk 我使用 asn 工具生成与 schema 对应的 c++ 头文件和源文件。然后我使用这些文件使用 c++ 创建一个数据包,并且 epacket 将拥有 packet->idpacket->objects 等成员。
  • the asn tool 什么 asn 工具?请参阅它生成的“asn 工具”文档和源代码。
  • 所以检查the correspding c files 看看具体的工具生成了什么。

标签: c++ asn.1


【解决方案1】:

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

因为您已将其定义为八位字节字符串 (SIZE(4)),所以如何将其初始化为“10”取决于您。您将字节填充为 0x00、0x00、0x00、0x0a。或者同样地,0x0a、0x00、0x00、0x00。

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

如果 TID 真的应该是一个整数值,那么这样做会更好的原因是,您可以消除任何字节顺序的歧义。用于模拟整数的八进制字符串 (SIZE(4)) 是不明确的。

2.

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

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

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多