簡體   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