2 回答
TA贡献1802条经验 获得超5个赞
猜猜这会起作用
import hashlib
import binascii
def H(R):
h = hashlib.sha256(R.encode('utf-8'))
return binascii.unhexlify(h.hexdigest())[0:4]
def binstr(x: bytes) -> str:
s = ""
for char in x:
ch = bin(char)[2:] # 0b101 -> 101
s += "0" * (8-len(ch)) + ch # 101 -> 00000101
return s
print(binstr(H("127.0.0.1"))) # 00010010110010100001011110110100
print(binstr(H("255.255.255.255"))) # 11110100010101000110001010111111
TA贡献1998条经验 获得超6个赞
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
它有 30 位数字(加上0b前缀),因为这是表示该整数所必需的数字。如果 的结果是struct.unpack('!I', H(R))[0]整数38(例如,如果R是'247.69.16.15'),则二进制表示bin()给您将是0b100110,它甚至更短。
bin()猜不出你想要前导零,当然也猜不出有多少。您需要做的是格式化整数,如下所示:
>>> '{:032b}'.format(struct.unpack('!I', b',\xc3Z\xfb')[0])
'00101100110000110101101011111011'
……或者,在我上面给出的极端例子中:
>>> '{:032b}'.format(struct.unpack('!I', H('247.69.16.15'))[0])
'00000000000000000000000000100110'
添加回答
举报