Encoding ASN.1/DER整数编码
我现在开始使用DER(杰出的编码规则)编码,在理解整数编码时遇到了问题 在对比文件中,该编码定义如下: 8.3.1整数值的编码应为原始编码。内容八位字节应由一个或多个八位字节组成 8.3.2如果整数值编码的内容八位字节由多个八位字节组成,则第一个八位字节的位和第二个八位字节的位8: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至
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
aka0x7F
,导致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)的操作;显然相反,参考文件说总是(!)”内容八位字节应为等于整数值的二元补码二进制数”。此处不是运算,而是表示二元补码中的表示,它仅将位切换为负数。