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

2024-05-28 20:48:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

这是Django的make_password函数的salt输入


Tags: 函数字符串import类型编码字节osurandom
1条回答
网友
1楼 · 发布于 2024-05-28 20:48:25

您可以使用chr并加入它们:

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

或者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Ú²~à

相关问题 更多 >

    热门问题