如何将一个sha256对象转换为整数并打包到python中的bytearray?
How to convert a sha256 object to integer and pack it to bytearray in python?
我想先把一个hash256对象转成一个32字节的整数,然后再打包成bytearray
>>> import hashlib
>>> hashobj = hashlib.sha256('something')
>>> val_hex = hashobj.hexdigest()
>>> print val_hex
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
>>> print len(val_hex)
64
十六进制字符串是 64 字节而不是 32 字节,这不是我想要的。
>>> val = hashobj.digest()
>>> print val
?ɶ?E?s????????5Bkz@R???6??H?
>>> print len(val)
32
这是一个 32 字节的字符串,我想将它转换为 32 字节的整数。
当我尝试时它给了我一个错误信息:
>>> val_int = int(val, 10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '?\xc9\xb6\x89E\x9ds\x8f\x8c\x88\xa3\xa4\x8a\xa9\xe35B\x01kz@R\xe0\x01\xaa\xa56\xfc\xa7H\x13\xcb'
我应该怎么做才能得到我的 int_val?
我如何使用结构将它(32 字节)打包成字节数组?我发现 python struct 文档中最长的格式是 'Q',它只有 8 个字节。
非常感谢。
bytearray 的要点不是将整个内容放入单个单元格中。这就是单元格只有 1 个字节大的原因。
和.digest()
returns一个字节串,所以你可以立即使用它:
>>> import hashlib
>>> hashobj = hashlib.sha256('something')
>>> val = hashobj.digest()
>>> print bytearray(val)
?ɶ�E�s������5Bkz@R���6��H�
>>> print repr(bytearray(val))
bytearray(b'?\xc9\xb6\x89E\x9ds\x8f\x8c\x88\xa3\xa4\x8a\xa9\xe35B\x01kz@R\xe0\x01\xaa\xa56\xfc\xa7H\x13\xcb')
Python2 中获取 SHA-256 摘要整数值的最简单方法是通过 hexdigest。或者,您可以遍历从二进制摘要构造的 bytearray。两种方法如下所示。
import hashlib
hashobj = hashlib.sha256('something')
val_hex = hashobj.hexdigest()
print val_hex
# Build bytearray from binary digest
val_bytes = bytearray(hashobj.digest())
print ''.join(['%02x' % byte for byte in val_bytes])
# Get integer value of digest from the hexdigest
val_int = int(val_hex, 16)
print '%064x' % val_int
# Get integer value of digest from the bytearray
n = 0
for byte in val_bytes:
n = n<<8 | byte
print '%064x' % n
输出
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
在Python3中,我们不能向hashlib
哈希函数传递一个纯文本字符串,必须传递一个bytes
字符串或者一个bytearray
,例如
b'something'
或
'something'.encode('utf-8')
或
bytearray('something', 'utf-8')
我们可以将第二个版本简化为
'something'.encode()
因为 UTF-8 是 str.encode
(和 bytes.decode()
)的默认编码。
要执行到 int
的转换,可以使用上述任何技术,但我们还有一个额外的选择:int.from_bytes
方法。为了获得正确的整数,我们需要告诉它将字节解释为大端数字:
import hashlib
hashobj = hashlib.sha256(b'something')
val = int.from_bytes(hashobj.digest(), 'big')
print('%064x' % val)
输出
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
我是这样做的
import hashlib
x = 'input'
hash = int.from_bytes(hashlib.sha256(x.encode('utf-8')).digest(), 'big')
print(my_hash)
# 91106456816457796232999629894661022820411437165637657988648530670402435361824
让我们检查散列的大小
print(len("{0:b}".format(my_hash)))
# 256
完美!
我想先把一个hash256对象转成一个32字节的整数,然后再打包成bytearray
>>> import hashlib
>>> hashobj = hashlib.sha256('something')
>>> val_hex = hashobj.hexdigest()
>>> print val_hex
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
>>> print len(val_hex)
64
十六进制字符串是 64 字节而不是 32 字节,这不是我想要的。
>>> val = hashobj.digest()
>>> print val
?ɶ?E?s????????5Bkz@R???6??H?
>>> print len(val)
32
这是一个 32 字节的字符串,我想将它转换为 32 字节的整数。
当我尝试时它给了我一个错误信息:
>>> val_int = int(val, 10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '?\xc9\xb6\x89E\x9ds\x8f\x8c\x88\xa3\xa4\x8a\xa9\xe35B\x01kz@R\xe0\x01\xaa\xa56\xfc\xa7H\x13\xcb'
我应该怎么做才能得到我的 int_val?
我如何使用结构将它(32 字节)打包成字节数组?我发现 python struct 文档中最长的格式是 'Q',它只有 8 个字节。
非常感谢。
bytearray 的要点不是将整个内容放入单个单元格中。这就是单元格只有 1 个字节大的原因。
和.digest()
returns一个字节串,所以你可以立即使用它:
>>> import hashlib
>>> hashobj = hashlib.sha256('something')
>>> val = hashobj.digest()
>>> print bytearray(val)
?ɶ�E�s������5Bkz@R���6��H�
>>> print repr(bytearray(val))
bytearray(b'?\xc9\xb6\x89E\x9ds\x8f\x8c\x88\xa3\xa4\x8a\xa9\xe35B\x01kz@R\xe0\x01\xaa\xa56\xfc\xa7H\x13\xcb')
Python2 中获取 SHA-256 摘要整数值的最简单方法是通过 hexdigest。或者,您可以遍历从二进制摘要构造的 bytearray。两种方法如下所示。
import hashlib
hashobj = hashlib.sha256('something')
val_hex = hashobj.hexdigest()
print val_hex
# Build bytearray from binary digest
val_bytes = bytearray(hashobj.digest())
print ''.join(['%02x' % byte for byte in val_bytes])
# Get integer value of digest from the hexdigest
val_int = int(val_hex, 16)
print '%064x' % val_int
# Get integer value of digest from the bytearray
n = 0
for byte in val_bytes:
n = n<<8 | byte
print '%064x' % n
输出
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
在Python3中,我们不能向hashlib
哈希函数传递一个纯文本字符串,必须传递一个bytes
字符串或者一个bytearray
,例如
b'something'
或
'something'.encode('utf-8')
或
bytearray('something', 'utf-8')
我们可以将第二个版本简化为
'something'.encode()
因为 UTF-8 是 str.encode
(和 bytes.decode()
)的默认编码。
要执行到 int
的转换,可以使用上述任何技术,但我们还有一个额外的选择:int.from_bytes
方法。为了获得正确的整数,我们需要告诉它将字节解释为大端数字:
import hashlib
hashobj = hashlib.sha256(b'something')
val = int.from_bytes(hashobj.digest(), 'big')
print('%064x' % val)
输出
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
我是这样做的
import hashlib
x = 'input'
hash = int.from_bytes(hashlib.sha256(x.encode('utf-8')).digest(), 'big')
print(my_hash)
# 91106456816457796232999629894661022820411437165637657988648530670402435361824
让我们检查散列的大小
print(len("{0:b}".format(my_hash)))
# 256
完美!