为什么我将四个字节转换为二进制只有30个二进制数字?

时间:2018-11-11 06:58:17

标签: python python-3.x binary byte bit

我有一个要哈希的字符串形式的IP地址R(即:"255.255.255.0"),并使用该哈希的前4个字节。然后,我想将该哈希结果转换为二进制格式:

def H(R):
    h = hashlib.sha256(R.encode('utf-8'))
    return unhexlify(h.hexdigest())[0:4]

我尝试执行以下操作,但是我只得到30位而不是32位(我删除了字符串的前2个字符,因为它是0b前缀):

bin(struct.unpack('!I', H(R))[0])[2:]

如何正确执行此操作? H(R)的结果看起来像b',\ xc3Z \ xfb'。我在这里尝试过这些方法,但都无法使用我要转换的格式。 Convert bytes to bits in python

  • 我所拥有的:来自32位IP地址字符串的哈希的4个字节,即:b',\xc3Z\xfb'
  • 我想要得到的是:32位二进制表示形式为字符串,即:'10101010101010101010101010101010'

2 个答案:

答案 0 :(得分:2)

猜猜这可以完成工作

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.localhost [NC]
RewriteRule ^(.*)$ http://localhost/jainvidhya/$1 [L,R=301]

RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^register/(.*)/$ register.php?role=$1&%1

答案 1 :(得分:2)

bin()为您提供了整数的二进制表示形式。在这种情况下,您要求二进制表示形式的特定整数是struct.unpack('!I', b',\xc3Z\xfb')[0]的结果,恰好是751000315:

>>> struct.unpack('!I', b',\xc3Z\xfb')[0]
751000315

bin()给您的751000315的二进制表示形式是0b101100110000110101101011111011,这是正确的:

>>> bin(751000315)
'0b101100110000110101101011111011'
>>> 0b101100110000110101101011111011
751000315

它有三十个数字(加上0b前缀),因为这是表示该整数所需的数字。如果struct.unpack('!I', H(R))[0]的结果是整数38(例如,如果R'247.69.16.15'),则二进制表示法bin()会给您是0b100110,甚至更短。

bin()不能猜测您想要前导零,它当然也不能猜测有多少。您需要做的是format您的整数,如下所示:

>>> '{:032b}'.format(struct.unpack('!I', b',\xc3Z\xfb')[0])
'00101100110000110101101011111011'

...,或者,在我上面给出的极端示例中:

>>> '{:032b}'.format(struct.unpack('!I', H('247.69.16.15'))[0])
'00000000000000000000000000100110'