ASN.1能否支持将字段长度放在不同的位置?

时间:2018-06-16 07:00:20

标签: asn.1 tlv

我有一个协议,其线上格式已经定义,我想使用ASN.1对其进行编码/解码,但它似乎打破了定义的BER / DER / PER选项。无论出于何种原因,协议开发人员将有效负载大小/长度放在有效负载本身之前 - 因此我无法使用自动BER / DER。但由于有效载荷可以是可变长度,我也不能使用PER。这是一个例子:

     12'b           12'b       4'b     4'b   
|------------|--------------|-------|------|
| some stuff | payload size | blah2 | blah |    Header
|------------------------------------------|
|              payload word 1              |
|------------------------------------------|
|                    ...                   |    Payload
|------------------------------------------|
|              payload word N              |
|------------------------------------------|
| much stuff | many bits | such doge | wow |    Trailer
|------------------------------------------|

所以这里可能有两个问题:

  1. 有没有办法使用其中一个ASN.1编码将某些字段指定为后一个字段的长度 - 所以你可以说比特9-20包含33-N * 32位的长度,但是你& #39;重新跳过21-32位,其中可能有其他无关的垃圾?
  2. 我可以看到如何编写算法/规则来支持上述内容,因此,如果目前还没有方法可以使用ASN.1,那么有没有办法(和文档)如何编写新规则或对现有编码的某种延伸?
  3. 修改

    澄清为什么我在不重复a previous question的情况下提出ASN.1,是因为它几乎正是我正在寻找的 - 显然没有办法处理我在这里询问的特定用例。我需要反序列化现有的二进制协议,而不是自己编写,因为已经有很多tools声称他们可以做某种形式的这种。如果有人有其他建议,我很乐意尝试。

3 个答案:

答案 0 :(得分:2)

ASN.1标准文档之一指定了一种称为编码控制表示法(ECN)的东西。它的目的是为了能够使用ASN.1和ECN来处理非ASN.1消息。它可能会做你需要的。但是,我会警告你,使用起来非常复杂,我只看到一家公司声称支持它(我不知道他们的支持是多么完整)。

答案 1 :(得分:0)

我相信你无法改变BER / DER / CER序列化中长度字段的位置 - 它只能出现在有效载荷之前,或者它可以只是构成有效载荷的一对哨兵(例如,无限长度)编码)。

但你的最终目标并不十分清楚。为什么你需要ASN.1?

答案 2 :(得分:0)

我认为您可能会对ASN.1的目标略有误解 - BER / DER / CER编码对ASN.1有​​些辅助,即使它们可能是其中最着名的部分。

ASN.1是一种指定抽象语法的方法:它是一种说“消息类型13是一系列任意长度的整数字符串对”的方式,没有说这个消息是如何表示的。因此,它是系统规范的一部分,因此实际上与其他后来的方法(如UML)处于IT思维空间的同一部分。来自X.680的摘要部分:

  

只要有必要定义信息的抽象语法而不以任何方式约束信息如何编码以进行传输,就可以应用ASN.1表示法。

压力在于抽象语法。

'编码规则'是这种语法的具体实现,在单独的标准X.690中定义,它将自身概括为:

  

本建议书|国际标准定义 a 一组基本编码规则(BER),可以应用于使用ASN.1表示法定义的类型的值。这些编码规则的应用产生这些值的传输语法。 [强调我的]

换句话说,编码规则是一个如何传输使用X.680语法定义的消息的示例,但它们不是唯一的方法。我认为,最初预期使用这两个标准的方式是,您开发或接收用ASN.1语法编写的规范,然后使用“ASN.1编译器”将其转换为一些代码可以序列化和反序列化该特定语法。 (尽管如此,我猜测分布最广泛的DER解析器,即用于X.509证书的解析器,通常是自定义编写的,而不是以这种方式派生的。)

通过'示例',我的意思是标准是说'如果您没有特别的理由选择其他传输语法,这里有一个您可能会考虑的预先指定'。

这意味着BER / DER / CER / PER编码并不是一种完全通用的方式来处理二进制数据,或者作为表达随机线格式结构的一种方式,所以它们不是旨在以您的问题表明您希望的方式进行扩展。

或者,如果发生了你正在处理的有线格式的设计者做出了与BER编码设计者相同的决定,那就是严格的类型 - 长度 - 有效载荷布局对于格式,那么你可能会为它反向设计一个ASN.1规范,因此使用ASN.1编译器来生成(解)序列化器(万岁,问题解决,为啤酒提前解决!)。

但看起来他们没有,所以你不能解读那个鸡蛋,而且我认为你已经坚持用手写电子格式的(去)序列化器了。这意味着什么(万岁?)你有一个很有趣但又分开的问题需要解决。