我正在按照spec实现BER,我问自己一个问题:使用不确定长度编码时,如何将整数0x10000000FFFFFFFCFC编码为BER整数(标签0x02)?
到目前为止,我在规范中没有找到任何转义字符,因此我认为我无法对这样的数字进行编码,因此也必须依靠发件人来知道这一点,并以简写形式发送Integer长度编码。但是在BitStrings中,会出现同样的问题。
答案 0 :(得分: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字节:因此,可以选择从不对整数使用不定长度格式
答案 1 :(得分:0)
AFAIK,仅为八位字节/位字符串定义了不确定长度的编码,而没有为数字类型定义
此外,我认为BER中没有任何转义机制。
不定长编码始终包含使用定长编码编码的数据块(八位位组/位字符串)。用BER的话来说,不确定的长度始终是构造形式。
使用定长编码,您总是有字节数可以按特定位置切割八位字节流,而无需任何标记。
使用不确定的长度编码时,您需要那些两个零的前哨(实际上是具有零长度值的TVL三元组)来指示数据的结束。但是你永远都不会生的非编码数据(否则可能会干扰哨兵)作为有效载荷。
答案 2 :(得分:-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)