我想知道是否有人可以向我解释hashlib中的.decode和.encode?

时间:2018-07-08 05:53:00

标签: encoding decoding sha256 sha hashlib

我知道您有一个十六进制字符串,并对它执行两次SHA256,然后字节交换最终的十六进制字符串。此代码的目标是通过串联两个事务来查找Merkle根。我想进一步了解后台发生的事情。您到底要解码和编码什么?

  
    
      

导入hashlib

             

transaction_hex =“ 93a05cac6ae03dd55172534c53be0738a50257bb3be69fff2c7595d677ad53666e344634584d07b8d8bc017680f342bc6aad523da31bc2b19e1ec0921078e872”

             

transaction_bin = transaction_hex.decode('hex')

             

hash = hashlib.sha256(hashlib.sha256(transaction_bin).digest())。digest()

             

hash.encode('hex_codec')       '38805219c8ac7e9a96416d706dc1d8f638b12f46b94dfd1362b5d16cf62e68ff'

             

hash [::-1] .encode('hex_codec')       'ff682ef66cd1b56213fd4db9462fb138f6d8c16d706d41969a7eacc819528038'

    
  

1 个答案:

答案 0 :(得分:0)

header_hex是小写ASCII字符的常规字符串,带有decode()参数的'hex'方法将其更改为(二进制)字符串(或Python中的bytes对象) 3)带有字节0x93 0xa0等。在C中,在这种情况下,它将是长度为64的无符号字符数组。

然后将长度为64的此数组/字节字符串用SHA256进行哈希处理,并再次对其结果(大小为32的另一个二进制字符串)进行哈希处理。因此hash是一个长度为32的字符串,或者是Python 3中该长度的字节对象。然后encode('hex_codec')encode('hex')的同义词(在Python 2中);在Python 3中,它取代了它(因此,这段代码可能在两种版本中都可以使用)。它再次输出一个ASCII(低十六进制)字符串,用两个字符串(其十六进制表示形式)替换每个原始字节(只是一个小整数)。因此,最后一位反转双哈希并将其输出为十六进制,以一种我通常称为“小写十六进制ASCII”的形式。