ASN.1&OPTIONAL

问题描述 投票:0回答: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

我以为,将字段设为可选字段只会在启用该字段时占用全部空间,否则只会占用1位。另外,如果我只有3个项目的DataItems序列,那么它将比完整的1024个项目使用更少的空间。而是,实例化上面的示例使用260226字节!

是否有使用ASN.1创建较小输出的方法?

asn.1
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
© www.soinside.com 2019 - 2024. All rights reserved.