代码之家  ›  专栏  ›  技术社区  ›  Andreas

ASN.1 BER编码整数0x10000000FFFFFC不定长度编码

  •  0
  • Andreas  · 技术社区  · 7 年前

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

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

    3 回复  |  直到 7 年前
        1
  •  2
  •   YaFred    7 年前

    你从不使用整数的不定长编码。。。

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

    The encoding of an integer value shall be primitive
    

    在这种情况下,规范会说:

    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字节:因此,您可以选择从不对整数使用不定长形式

        2
  •  0
  •   Ilya Etingof    7 年前

    另外,我不认为BER中存在任何逃逸机制。

    不定长编码总是包含使用定长编码编码的数据块(八位字节/位字符串)。用BER的话说,不定长总是以构造形式出现。

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

        3
  •  -1
  •   Bruno Rijsman    7 年前

    您所关心的场景是:(a)使用图2中所示的替代构造编码,(b)内容八位字节包含八位字节0x0000,它将(错误地)解释为内容结束标记。

    当我第一次读到这个问题的时候,我的第一个直觉是,肯定是伯尔说了些什么。可能有一个转义机制来避免内容中的0x0000。可能编码规则是这样的,0x0000自然不会出现。

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

    因此,我认为您是对的:我认为发送方不应该在这种情况下使用替代构造的编码(这实际上意味着,对于存在这种潜在问题的数据类型,例如整数和位字符串,永远不应该使用替代构造的编码)。

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

    推荐文章