据我所知,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来创建更小的输出?
发布于 2019-11-28 02:48:53
首先,请注意您的规范是无效的...您必须添加自动标记
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 1CB2E5https://stackoverflow.com/questions/58971075
复制相似问题