繁体   English   中英

如何在 Python 中将字节转换为相同长度的字符串(每个字节 1 个字符)?

[英]How to convert bytes to a string of the same length in Python (1 character for each byte)?

我需要一个随机字符串,我可以写下来用于散列函数中的盐。 我可以生成一些随机字节并将它们视为十六进制:

import os, binascii
print(binascii.b2a_hex(os.urandom(32)))
b'76449cd6134d64353122102fcb512d1eae1bd8437202b6e06e91a422ce9e386b' # 64 chars

太好了,但是如何将这些字节直接转换为字符串,即不一定可打印,但正好是 32 个字符? 哈希函数需要一个字符串,而不是最大长度为 32 的“字节”类型。

我不确定如何在 Python 中进行编码,但我想我需要类似于旧的 8 位计算机或 C 程序将字节转换为字符(ASCII 或其他)的方式。

这是用于 Django 的 make_password 函数的 salt 输入。

你可以使用chr并加入他们:

>>> s = ''.join(map(chr, os.urandom(32)))
>>> print(len(s), s)
32 ^Ô¸ÒÜì<ù³B_¶t¶Ùj)"×Ï‚ž™Të$)

或者用 latin1 decode

>>> s = os.urandom(32).decode('latin1')
>>> print(len(s), s)
32 ùLÖ]ù²ì¥Ý.b#AÎ+Ûê+9'Za37

如果您确实需要通过这样一个长度为 64 的十六进制字符串,只需先将其取消十六进制:

>>> b = b'76449cd6134d64353122102fcb512d1eae1bd8437202b6e06e91a422ce9e386b'
>>> s = binascii.a2b_hex(b).decode('latin1')
>>> print(len(s), s)
32 vDÖMd51"/ËQ-®ØCr¶àn¤"Î8k

或者从随机的 32 个字节开始,将它们十六进制显示并解码它们(没有十六进制+非十六进制)以供使用:

>>> b = os.urandom(32)
>>> binascii.b2a_hex(b)
b'5751b7bfe1a3ea50c9f8143d64f4ce07a05a21805c976536147114dab27ee08c'
>>> s = b.decode('latin1')
>>> print(len(s), s)
32 WQ·¿á£êPÉø=dôΠZ!\e6qÚ²~à

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM