我有以下python sript,它会加倍一个十六进制值:
import hashlib
linestring = open('block_header.txt', 'r').read()
header_hex = linestring.encode("hex") // Problem!!!
print header_hex
header_bin = header_hex.decode('hex')
hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
hash.encode('hex_codec')
print hash[::-1].encode('hex_codec')
我的文本文件“block_header.txt”(十六进制)如下所示:
0100000081cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122bc7f5d74df2b9441a42a14695
不幸的是,打印变量header_hex的结果看起来像这样(不像txt文件):
303130303030303038316364303261623765353639653862636439333137653266653939663264653434643439616232623838353162613461333038303030303030303030303030653332306236633266666663386437353034323364623862316562393432616537313065393531656437393766376166666338383932623066316663313232626337663564373464663262393434316134326131343639350a
我认为问题出在这一行:
header_hex = linestring.encode("hex")
如果我删除“.encode(”hex“)” - part,那么我会收到错误
未处理的TypeError“Odd-length string”
任何人都可以给我一个提示可能有什么问题吗? 非常感谢你:))
答案 0 :(得分:1)
你做的编码/解码太多了。
与其他提到的一样,如果您的输入数据是十六进制,那么最好使用strip()
去除前导/尾随空格。
然后,您可以使用decode('hex')
将十六进制ASCII转换为二进制。在执行了您想要的任何散列后,您将获得二进制摘要。
如果您希望能够“看到”该摘要,可以使用encode('hex')
将其重新转换为十六进制。
以下代码适用于输入文件,在开头或结尾添加了任何类型的空格。
import hashlib
def multi_sha256(data, iterations):
for i in xrange(iterations):
data = hashlib.sha256(data).digest()
return data
with open('block_header.txt', 'r') as f:
hdr = f.read().strip().decode('hex')
_hash = multi_sha256(hdr, 2)
# Print the hash (in hex)
print 'Hash (hex):', _hash.encode('hex')
# Save the hash to a hex file
open('block_header_hash.hex', 'w').write(_hash.encode('hex'))
# Save the hash to a binary file
open('block_header_hash.bin', 'wb').write(_hash)