0

我正在根据规范实施 BER ,我问自己一个问题:当我使用不定长度编码时,如何将整数 0x10000000FFFFFFFC 编码为 BER 整数(标记 0x02)?

到目前为止,我在规范中没有发现任何转义字符,所以我假设我无法对这样的数字进行编码,因此必须依赖发送者也知道这一点,并使用短格式长度编码发送整数。但在 BitStrings 中,也会出现同样的问题。

4

3 回答 3

2

您永远不要使用带有整数的不定长度编码......

它写在 X.690 (08/2015) 第 8.3 章(整数值的编码)中:

The encoding of an integer value shall be primitive

不定长度用于构造类型(SEQUENCE、SEQUENCE OF ...)和可包含大值的基本类型(字符串类型、BITSTRING、OCTET STRING ...)。在这种情况下,规范会说:

The encoding of a bitstring value shall be either primitive or constructed at the option of the sender

CER 编码规则(第 9 章)让您了解大值在撰写本文时的含义:

 Bitstring, octetstring, and restricted character string values shall be encoded with a primitive encoding if they would require no more than 1000 contents octets, and as a constructed encoding otherwise

所以你会看到,即使是一个巨大的整数,在编码时也总是小于 1000 字节:因此选择永远不要对整数使用不定长度形式

于 2018-10-11T06:58:05.617 回答
0

AFAIK,不定长度编码仅适用于八位字节/位字符串,但不适用于数字类型。

另外,我认为 BER 中没有任何转义机制。

不定长编码总是包含使用定长编码编码的数据块(八位字节/位串)。用 BER 的说法,不定长度总是在构造的形式中。

使用确定长度编码,您总是有字节数来按特定位置切割八位字节流,您不需要任何哨兵。

使用不定长编码,您需要那些两个零标记(实际上是具有零长度值的 TVL 三元组)来指示数据结束。但是您永远不会将原始数据(例如非编码数据)(否则可能会干扰哨兵)作为有效负载。

于 2018-10-10T21:41:32.237 回答
-1

您担心以下情况:(a) 使用图 2 中所示的替代构造编码和 (b) 内容八位字节包含八位字节 0x0000,这将(错误地)被解释为内容结束标记。

当我第一次阅读这个问题时,我的第一反应是,BER 肯定会对此有所说明。也许有一种转义机制可以避免内容中出现 0x0000。也许编码规则是这样的,0x0000 自然不会出现。

但是在仔细扫描了 X.690 规范几次之后,我什么也找不到。

所以,我认为你是对的:我认为发件人不应该在这种情况下使用替代构造编码(这实际上意味着,永远不应该对具有这种潜在问题的数据类型使用替代构造编码,例如整数和位串)。

作为比较,Thrift 在编码结构时仅允许在非常特定的情况下使用 STOP 标记(字节 00)作为“不再有字段”标记(请参阅https://github.com/erikvanoosten/thrift-missing-specification/blob /master/rpc-spec-binary-protocol.asciidoc )

于 2018-10-10T16:12:36.023 回答