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

我有一个字符串形式的 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'。我已经尝试过这里的方法,但没有一个适用于我正在转换的格式。在python中将字节转换为位

  • 我所拥有的:来自 32 位 IP 地址字符串的哈希的 4 个字节,即: b',\xc3Z\xfb'

  • 我想要得到的是:作为字符串的 32 二进制表示,即: '10101010101010101010101010101010'


一只名叫tom的猫
浏览 177回答 2
2回答

12345678_0001

猜猜这会起作用import hashlibimport binasciidef 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 sprint(binstr(H("127.0.0.1"))) # 00010010110010100001011110110100print(binstr(H("255.255.255.255"))) # 11110100010101000110001010111111

米琪卡哇伊

bin()给你一个整数的二进制表示。在这种情况下,您要求以二进制表示的特定整数是 的结果struct.unpack('!I', b',\xc3Z\xfb')[0],恰好是 751000315:>>> struct.unpack('!I', b',\xc3Z\xfb')[0]751000315bin()给你的 751000315 的二进制表示是0b101100110000110101101011111011,这是正确的:>>> bin(751000315)'0b101100110000110101101011111011'>>> 0b101100110000110101101011111011751000315它有 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'
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python