据我了解,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创建较小输出的方法?
首先,请注意您的规范无效...您必须添加自动标签
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
原因是解码时无法分辨name
和address
之间的差异(因为它们都是可选的。
关于您的问题,我用来快速回答的资源是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