我想制作SHA256哈希器,它将输入和输出保存在文本文件中。我在堆栈溢出中搜索答案,但它不起作用。我希望它写在文本文件中:
all = str("At: " + date + " you have encrypted: " + text + " into:" + hex_dig)
text_file.write(together)
虽然日期看起来像这样:
date = time.strftime("%Y-%m-%d %H:%M:%S")
它在样本的第一行给了我这个错误:TypeError: Can't convert 'bytes' object to str implicitly
。
我猜hex_dig
是一个字节对象(您是否使用digest
而不是hexdigest
来获取哈希?如果是这种情况,只需使用正确的函数即可解决此问题:
sha256_hasher = hashlib.sha256()
sha256_hasher.update(your_data_goes_here)
hex_dig = sha256_hasher.hexdigest()
Otheriwse,更一般地说,您正在尝试将str
和bytes
对象连接在一起。你不能这么做。您需要将字节对象转换为字符串。如果它只包含文本数据,您可以对其进行解码:
hex_dig = hex_dig.decode("ascii")
或者,如果它只包含字节,并且您想查看可以使用的十六进制binascii.hexlify
(您仍然需要decode
,因为它返回一个字节):
import binascii
hex_dig = binascii.hexlify(hex_dig).decode("ascii")
顺便说一句,您不需要在str
函数调用中包装字符串,只有在您想要获取还不是字符串的对象的字符串表示形式时才需要它。你拥有的(或你想要的)已经是一个字符串,所以它是一个多余的调用。你不能尝试连接不同类型的东西并将所有这些包装在一个str
的cal中,并希望python能为你解决它 - 它不会(也不应该,因为它是模棱两可的 - explicit is better than implicit
)。
date = time.strftime("%Y-%m-%d %H:%M:%S")
all = "At: %s you have encrypted: %s into: %s" % (date, text, hex_dig)
text_file.write(all)
我强烈推荐format
方法用于这种情况。
你写道:
all = str("At: " + date + " you have encrypted: " + text + " into:" + hex_dig)
在format
语法中,它看起来像这样:
all = "At: {} you have encrypted: {} into:{}".format(date,text,hex_dig)
format
的精彩之处在于它非常轻松地处理各种数据类型到字符串的转换(通常)。
提示:如果要指定顺序和/或重复占位符,可以使用{0} {1} {2}
等设置{}
。