首页
学习
活动
专区
圈层
工具
发布

ASN.1可选
EN

Stack Overflow用户
提问于 2019-11-21 17:09:17
回答 1查看 324关注 0票数 0

据我所知,ASN.1 UPER编码尽可能高效地打包编码数据。

我使用asn1scc将其编译成C代码:

代码语言:javascript
复制
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来创建更小的输出?

EN

回答 1

Stack Overflow用户

发布于 2019-11-28 02:48:53

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

代码语言:javascript
复制
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/

下面是几个例子:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58971075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档