【问题标题】:ASN.1 Expressing SEQUENCE size constraintASN.1 表达序列大小约束
【发布时间】:2016-06-21 00:06:36
【问题描述】:

我想在 ASN.1 中描述一个现有数据结构,这样我就可以使用合适的库来解码/编码/验证交易,而无需从头开始编写所有内容。

还有:

  • 我无法更改任何数据结构;
  • 所有字段均为 ASCII 字符;
  • 在大多数数组 (SEQUENCES) 的定义中,发送的元素数量由前面的 counter 字段定义。

考虑以下简化示例:

World-Schema DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN
  Test ::= SEQUENCE {
     id IA5String (SIZE(5)),
     nbData IA5String (SIZE(2)),
     dataList ListOfData
  }
  ListOfData ::= SEQUENCE(SIZE(0..99)) OF DataPoint
  DataPoint ::= SEQUENCE {
     x IA5String (SIZE(2)),
     y IA5String (SIZE(2))
  }
END

nbData 字段指示传输数据流中存在的dataPoint 元素的数量。

除了nbData 实际上是一个编码为字符串的整数之外,这一定是一种非常常见的压缩传输数据的方式。尽管如此,我仍然在努力寻找一种方法来定义这种结构。

如何在 ASN.1 中表达这个约束?

【问题讨论】:

  • 不清楚你想要实现什么。你想定义像dataList ListOfData (SIZE(nbData))这样的东西吗?
  • 是的,这就是我想要的。但是编译器抱怨('nbData'被引用,但未定义)所以我认为在 SIZE 约束中只允许常量值

标签: asn.1


【解决方案1】:

这种约束不是 ASN.1 的“原生”,尤其是因为包含整数的字段被表示为字符串。虽然 ECN(编码控制符号)可以处理这个问题,但最好使用 ASN.1 所称的“用户定义的约束”,例如:

Test ::= SEQUENCE {
     id IA5String (SIZE(5)),
     nbData IA5String (SIZE(2)),
     dataList ListOfData
} (CONSTRAINED BY {-- English text describing your constraint --})

一些商业 ASN.1 编译器能够使用此约束表示法在生成的编码器/解码器中生成函数存根,以允许您实施超出 ASN.1 约束表示法内置功能的约束。

有一种更复杂的方法,您可以在 SEQUENCE 上使用“WITH COMPONENTS”约束来强制执行该约束,但编写完整约束所需的文本量可能不值得。

【讨论】:

    【解决方案2】:

    您如何在 ASN.1 中表达该约束?你不能。

    您可以查看 ECN,这是一种(相当复杂的)语法,是 ASN.1 系列的一部分,旨在与 ASN.1 一起使用以指定非标准(即除了 BER, PER等)编码。

    我不知道 ECN 是否具有足够的表现力来指定您想要的编码,但我认为很有可能。但是,您必须弄清楚 ECN,然后您必须找到支持 ECN 的工具。祝你好运!

    【讨论】:

      【解决方案3】:

      您将定义消息结构和允许值的 ASN.1 架构与符合该架构的特定消息的内容混淆了。您在编写架构时为所有消息定义允许的数据点数 (0..99)。

      您在发送消息时在运行时定义特定消息中的数据点数。 BER 或 XER 等编码规则指定了消息的传输方式——你给编码器一个包含 17 个数据点的 ListOfData 消息,它将:

      1) check that the number of points is within the range allowed by the schema (0..99), and
      2) send that list of 17 DataPoints as specified by the encoding rules.
      

      当您收到消息时,ListOfData 将具有从编码规则中已知的大小 (17),并且该大小将再次根据架构 (0..99) 进行验证。

      如果你想在你的程序中创建一个单独的 nbData 变量,你可以将 ListOfData 的长度复制到其中你解码消息之后。但是 nbData 不是在模式内部指定并在消息中冗余传输的变量。

      如果您无法更改诸如 Test 数据结构之类的内容以完全摆脱 nbData,只需在发送者处使用正确的值填充它。在接收者处,要么忽略它,要么在消息解码后将其与正确的值进行比较。不要费心去弄乱 ASN.1 来添加约束;处理它的正确方法是删除垃圾。


      ASN.1 的特点是它是一种抽象数据描述语言,独立于编程语言和序列化格式。如果您使用 C 等低级语言进行编程,您将使用具有整数个数据点 (nbData) 和指向 struct DataPoint 的指针的内存结构。但是,如果您使用 Java、JS、Python 等高级语言,ListOfData 将是一个数组或列表,并且它会有一个长度。

      因此,如果您使用 C 进行编程,您的 ASN.1 序列化库可能会为您提供一个 ListOfData 结构,其中内置了类似 nbData 的内容。但是如果你使用 Python 编程,这个库会给你一个列表,如果你想要类似 nbData 的东西,你可以使用 len(ListOfData) 来获得它。

      ASN.1 抽象出实现中的差异,这就是为什么 nbData 不是一个单独的 ASN.1 变量,它内置于 ListOfData 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 2020-10-06
        • 1970-01-01
        • 1970-01-01
        • 2016-03-28
        • 1970-01-01
        相关资源
        最近更新 更多