Python - 将文本文件读取到String

时间:2015-09-21 17:36:37

标签: python hex

我有以下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”

任何人都可以给我一个提示可能有什么问题吗? 非常感谢你:))

1 个答案:

答案 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)