【发布时间】:2019-11-21 09:09:17
【问题描述】:
据我了解,ASN.1 UPER 编码尽可能高效地打包编码数据。
使用asn1scc我把它编译成c代码:
HelloWorld DEFINITIONS ::= BEGIN
DataItems ::= SEQUENCE (SIZE (0..1024)) OF DataItem
DataItem ::= SEQUENCE {
name IA5String (SIZE (0..32)) OPTIONAL,
address IA5String (SIZE (0..256)) OPTIONAL
}
END
我认为将字段设为 OPTIONAL 只会在启用时消耗全部空间,否则只会消耗 1 位。此外,如果我有一个只有 3 个项目的 DataItems 序列,那么它使用的空间将少于完整的 1024 个项目。 相反,实例化上面的示例使用 260226 字节!
有没有办法使用 ASN.1 创建更小的输出?
【问题讨论】:
-
你真的在看UPER编码的大小吗?仅当您包含最大允许数量的 DataItems 时,UPER 编码才会达到这种大小,每个 DataItems 都包含最大允许长度的名称和地址。
-
我查看了编码后比特“流”的大小。我通过让 asn1scc 编译器发出用例然后用 512 替换 1024 来做到这一点。我预计大约 130113 字节,但仍然得到 260226 字节的测试文件。
-
我确认我上面所说的。如果包含较短的字符串或较少的元素,UPER 不会产生该大小的比特流。我对 asn1scc 不熟悉,因此无法对此发表评论。
标签: asn.1