asn.1 - 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 创建更小的输出?
解决方案
首先,请注意您的规范无效......您必须添加 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
原因是您无法区分解码之间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
推荐阅读
- flutter - 颤振,位置参数太多(但不是这样)
- tensorflow - tensorflow 1.13.0 & 1.14.0rc0:为 tflite 服务模型
- html - Extjs如何将html div添加为项目
- node.js - 运行前端包的节点服务器
- excel - FindNext 在使用“Do Loop while”循环时不更新 Range.Address
- php - 试图将mysql数据获取到json_output的两个while循环中
- wpf - 如何为 SolidColorBrush 资源设置动画?
- java - Mongo DB使用正则表达式查找查询未返回预期输出
- javascript - 如何等到 async.forEachOf 完成,然后将结果发送给客户端?
- android - 我们可以避免在 Android 中询问 sim 阅读用户权限吗?