0

我有一个协议,其在线格式已经定义,我想使用 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 的长度,但你正在跳过位 21-32 可以包含其他不相关的垃圾?
  2. 我可以看到如何编写算法/规则来支持上述内容,所以如果目前没有办法用 ASN.1 做到这一点,是否有办法(和文档)来编写新规则或扩展某种对现有编码的影响?

编辑

为了澄清我为什么要提出 ASN.1,而不重复前面的问题,是因为它几乎正是我正在寻找的 - 只是显然没有办法处理我在这里询问的特定用例。我需要反序列化现有的二进制协议,而且我不想自己编写,因为已经有很多工具声称他们可以做到这一点。如果有人有其他建议,我很乐意尝试。

4

3 回答 3

2

ASN.1 标准文档之一指定了称为编码控制表示法 (ECN) 的内容。其目的是使使用 ASN.1 加上 ECN 来处理非 ASN.1 消息成为可能。它可能会满足您的需求。但是,我会警告您,使用它非常复杂,而且我只看到一家公司声称支持它(我不知道他们的支持有多完善)。

于 2018-06-17T19:20:44.593 回答
0

我认为您可能对 ASN.1 的目标略有误解——BER/DER/CER 编码在某种程度上是 ASN.1 的辅助,尽管它们可能是其中最知名的部分。

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

只要需要定义信息的抽象语法,就可以应用 ASN.1 符号,而不会以任何方式限制信息如何编码以进行传输。

重点是抽象语法。

“编码规则”是这种语法的具体实现,在单独的标准X.690中定义,它总结为:

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

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

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

这意味着 BER/DER/CER/PER 编码并不是一种完全通用的传输二进制数据的方式,也不是一种表达随机线格式结构的方式,因此它们的设计目的不是可扩展的您的问题表明您希望的方式。

或者,如果您正在处理的线路格式的设计者已经做出了与 BER 编码设计者相同的决定,即格式的严格类型长度有效负载布局,那么您可能会进行逆向工程为其制定了 ASN.1 规范,因此使用 ASN.1 编译器生成(反)序列化器(万岁,问题解决了,早点喝啤酒!)。

但看起来他们没有,所以你不能解读那个鸡蛋,我认为你坚持为你的有线格式手动编写一个(反)序列化器。这意味着(万岁?)你有一个有趣的、但又独立的问题要解决。

于 2018-06-18T09:43:38.497 回答
0

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

不过,您的最终目标还不是很清楚。为什么你需要 ASN.1?

于 2018-06-16T16:44:34.060 回答