【问题标题】:ASN.1 & OPTIONALASN.1 & 可选
【发布时间】: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


【解决方案1】:

首先,请注意您的规范无效...您必须添加自动标签

HelloWorld DEFINITIONS AUTOMATIC TAGS ::= BEGIN
    DataItems ::= SEQUENCE (SIZE (0..1024)) OF DataItem

    DataItem ::= SEQUENCE {
        name IA5String (SIZE (0..32)) OPTIONAL,
        address IA5String (SIZE (0..256)) OPTIONAL
    }

END

原因是您在解码时无法区分nameaddress(因为它们都是可选的)。

至于你的问题,我用来快速回答的资源是https://asn1.io/asn1playground/

几个例子:

value DataItems ::= {
{ name "one" },
{ name "two" },
{ name "three" }
}  
-- Encoded successfully in 14 bytes:
-- 00707BF7 6583E9DF 7C2F4D1C B2E5

value DataItems ::= {
{ name "one", address "one" },
{ name "two", address "two" },
{ name "three", address "three" }
}
-- Encoded successfully in 27 bytes:
-- 00787BF7 6501EFDD 970FA77D E03E9DF7 E2F4D1CB 2E502F4D 1CB2E5

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多