首页 > 解决方案 > ASN.1 & 可选

问题描述

据我了解,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 创建更小的输出?

标签: asn.1

解决方案


首先,请注意您的规范无效......您必须添加 AUTOMATIC TAGS

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

推荐阅读