我正在根据等级库实现误码率,我问自己一个问题:当我使用不定长度编码时,如何将Integer 0x100000FFFFFFFC编码为BER整数(标记0x02)?
到目前为止,我还没有在规范中找到任何转义字符,所以我假设,我不能对这样的数字进行编码,因此也必须依赖发送方知道这一点,并使用短表单长度编码发送Integer。但在BitStrings中,也出现了同样的问题。
发布于 2018-10-11 06:58:05
你从不对整数使用不定长度编码..。
它写在X.690 (08/2015)第8.3章(整数值的编码)中:
The encoding of an integer value shall be primitive不定长度用于构造类型(序列,序列.)对于可以包含大值的基本类型(字符串类型、BITSTRING、八进制字符串.)。在这种情况下,规范会说:
The encoding of a bitstring value shall be either primitive or constructed at the option of the senderCER编码规则(第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-10 21:41:32
AFAIK,不定长度编码只为八进制/位字符串定义,而不为数字类型定义。
此外,我认为在BER中没有任何逃避机制。
不定长度编码总是包含使用确定长度编码编码的数据块(八进制/位字符串)。在误码率术语中,不定长度总是以构造的形式存在。
有了一定的长度编码,你总是有字节计数来切割八进制流的特定位置,你不需要任何哨兵。
对于不确定长度编码,您需要那些双零哨兵(实际上是一个具有零长度值的TVL三重奏)来表示数据的结束。但你从来没有原始的,例如,非编码的数据(否则可能会干扰哨兵)作为有效载荷。
发布于 2018-10-10 16:12:36
您关注的场景是:(a)使用图2所示的替代构造编码;(b)内容八进制包含octets 0x0000,这将(不正确地)解释为内容结束标记。
当我第一次读到这个问题时,我的第一反应是,毫无疑问,BER说了一些关于这一点的话。也许有一种逃逸机制来避免内容中的0x0000。也许编码规则是这样的,0x0000自然不会发生。
但经过几次仔细扫描X.690规格之后,我什么也找不到。
因此,我认为您是对的:我认为发送方不应该在这样的场景中使用替代构造编码(这实际上意味着,对于具有此潜在问题的数据类型,例如整数和位字符串,永远不应该使用替代构造编码)。
作为比较,在非常特殊的情况下,在对结构进行编码时,Thrift只允许停止标记(字节00)作为“禁止字段”标记(请参阅https://github.com/erikvanoosten/thrift-missing-specification/blob/master/rpc-spec-binary-protocol.asciidoc)。
https://stackoverflow.com/questions/52744009
复制相似问题