为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只名叫tom的猫 2021-08-14 17:23:21
我有一个字符串形式的 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'
查看完整描述

2 回答

?
12345678_0001

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


查看完整回答
反对 回复 2021-08-14
?
米琪卡哇伊

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'


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信