繁体   English   中英

ASN.1 BER编码整数0x‭10000000FFFFFFFCFC无限长度编码

[英]ASN.1 BER Encode Integer 0x‭10000000FFFFFFFC Indefinite Length Encoded

我正在按照规范实现BER,我在问自己一个问题:使用不确定长度编码时,如何将整数0x‭10000000FFFFFFFCFC编码为BER整数(标签0x02)?

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

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

它是在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字节:因此,请选择从不对整数使用不定长度格式

AFAIK,仅针对八位字节/位字符串定义了不定长编码,而没有针对数字类型定义不定长编码。

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

不定长编码始终包含使用定长编码编码的数据块(八位位组/位字符串)。 用BER的话来说,不确定的长度总是构造的形式。

使用定长编码时,您始终有字节数可以按特定位置切割八位字节流,而无需任何标记。

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

您担心以下情况:(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM