Encoding ASN.1/DER整数编码

Encoding ASN.1/DER整数编码,encoding,asn.1,der,Encoding,Asn.1,Der,我现在开始使用DER(杰出的编码规则)编码,在理解整数编码时遇到了问题 在对比文件中,该编码定义如下: 8.3.1整数值的编码应为原始编码。内容八位字节应由一个或多个八位字节组成 8.3.2如果整数值编码的内容八位字节由多个八位字节组成,则第一个八位字节的位和第二个八位字节的位8: 不都是一,;及 不应全部为零 注意–这些规则确保整数值始终以尽可能小的八位字节数编码 8.3.3内容八位字节应为等于整数值的二位补码二进制数,由第一个八位字节的位8至1、第二个八位字节的位8至1、每个八位字节的位8至

我现在开始使用DER(杰出的编码规则)编码,在理解整数编码时遇到了问题

在对比文件中,该编码定义如下:

8.3.1整数值的编码应为原始编码。内容八位字节应由一个或多个八位字节组成

8.3.2如果整数值编码的内容八位字节由多个八位字节组成,则第一个八位字节的位和第二个八位字节的位8:

  • 不都是一,;及

  • 不应全部为零

  • 注意–这些规则确保整数值始终以尽可能小的八位字节数编码

    8.3.3内容八位字节应为等于整数值的二位补码二进制数,由第一个八位字节的位8至1、第二个八位字节的位8至1、每个八位字节的位8至1组成,依次包括内容八位字节的最后一个八位字节

    在另一个网站上,有人解释说,对于二进制表示以1开头的正数,在前面加一个零字节。在对先前关于stackoverflow的问题的回答中也提到了这一点

    不幸的是,从这些答案中,我看不出后一种说明如何从参考文件的规则中推导出来

    例如,如果我想对数字128进行编码,为什么我不能这样做呢

    [标记字节][长度字节]10000000

    我知道正确的编码应该是[tag byte][length byte]00000000 10000000,但是上面的变量会影响哪种情况?也许这和两个的补码有关,但两个的补码不是128还是10000000吗

    我希望你能帮助我理解为什么微软网站上的描述等同于原始定义。谢谢。

    规则(8.3.3)规定,如果第一个(最低索引)内容字节的高位设置为负数

    02 01 80
    包含内容
    0b1000\u 0000
    。由于设置了高位,因此数字为负数

    翻转所有位(
    0b0111\u 1111
    ),然后添加一位:
    0b1000\u 0000
    ;这意味着它代表负128

    对于退化程度较低的示例,
    0b1000\u 0001
    =>
    0b0111\u 1110
    =>
    0b0111\u 1111
    ,表明
    0x81
    为负127


    对于数字(正数)127,由于未设置高位,因此该数字显示为正数,因此内容仅为
    0b0111\u 1111
    aka
    0x7F
    ,导致
    02 01 7F

    可能会有所帮助,但不幸的是,到目前为止还没有。我已经考虑过这个文档,但它似乎也没有提到,对于负整数,添加了一个额外的零字节。相反,该文件称“负整数的编码有自己的规则”,然后用自己的话描述了这两个整数的补码。但是在ASN.1的参考文件中,“否定”一词只出现了三次,并且没有一次提到整数的编码。所以我仍然想知道这些“自己的规则”是从哪里来的。对不起,但我不明白这是如何回答我的问题的。也许我没有把我的观点说清楚。我基本上理解2的补码中数字的表示是如何工作的。我的问题涉及到微软网站上的一句话:“如果整数为正,但高位设置为1,则在内容中添加一个前导0x00以表示数字不是负的。”我仍然不明白这是从何而来的?额外的0字节表示未设置第一个字节的高位,所以这个值是正15,但数字是0b000_0000_1000_0000(128)。如果没有它,高位被设置,因此数字是负数:两个7位值0b000_0000的补码,这是(在8位land中)
    -128
    。好的,我想现在我知道我错在哪里了。我认为1000 0000是128的二进制表示;但这不是表示为2的补码。如果我们考虑符号字节,我们需要一个0开始,所以我们想在开始时设置一个零位。既然我们必须在编码中使用完整的字节,那么我们就必须在开头加上一个完整的零字节。@Bilbo是的,差不多就是这样。再加上另一个让我感到困惑的地方:微软的文章说“TLV三元组的值字段包含编码的整数(如果是正的),或者包含其两个补码(如果是负的)。”这里必须说明取两个补码(通过切换位并加1)的操作;显然相反,参考文件说总是(!)”内容八位字节应为等于整数值的二元补码二进制数”。此处不是运算,而是表示二元补码中的表示,它仅将位切换为负数。