我有一个要哈希的字符串形式的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
b',\xc3Z\xfb'
'10101010101010101010101010101010'
答案 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'