как показать правильное слово в моем коде, мой код: os.urandom (64) - PullRequest
2 голосов
/ 31 мая 2010

Мой код:

print os.urandom(64)

который выводит:

> "D:\Python25\pythonw.exe"  "D:\zjm_code\a.py" 
\xd0\xc8=<\xdbD'
\xdf\xf0\xb3>\xfc\xf2\x99\x93
=S\xb2\xcd'\xdbD\x8d\xd0\\xbc{&YkD[\xdd\x8b\xbd\x82\x9e\xad\xd5\x90\x90\xdcD9\xbf9.\xeb\x9b>\xef#n\x84

, который не читается, поэтому я попробовал это:

print os.urandom(64).decode("utf-8")

но тогда я получаю:

> "D:\Python25\pythonw.exe"  "D:\zjm_code\a.py" 
Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 17, in <module>
    print os.urandom(64).decode("utf-8")
  File "D:\Python25\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-3: invalid data

Что я должен сделать, чтобы получить читабельный вывод?

Ответы [ 3 ]

8 голосов
/ 31 мая 2010

Нет недостатка в выборе. Вот пара:

>>> os.urandom(64).encode('hex')
'0bf760072ea10140d57261d2cd16bf7af1747e964c2e117700bd84b7acee331ee39fae5cff6f3f3fc3ee3f9501c9fa38ecda4385d40f10faeb75eb3a8f557909'
>>> os.urandom(64).encode('base64')
'ZuYDN1BiB0ln73+9P8eoQ3qn3Q74QzCXSViu8lqueKAOUYchMXYgmz6WDmgJm1DyTX598zE2lClX\n4iEXXYZfRA==\n'
2 голосов
/ 31 мая 2010

os.urandom дает вам 64-байтовую строку. Кодирование в шестнадцатеричном формате, вероятно, является лучшим способом сделать его «читабельным» человеком в некоторой степени. E.g.:

>>> s = os.urandom(64)
>>> s.encode('hex')
'4c28351a834d80674df3b6eb5f59a2fd0df2ed2a708d14548e4a88c7139e91ef4445a8b88db28ceb3727851c02ce1822b3c7b55a977fa4f4c4f2a0e278ca569e'

Конечно, это дает вам 128 символов в результате, что может быть слишком длинной строкой для удобного чтения; это легко разделить, хотя - например:

>>> print s[:32].encode('hex')
4c28351a834d80674df3b6eb5f59a2fd0df2ed2a708d14548e4a88c7139e91ef
>>> print s[32:].encode('hex')
4445a8b88db28ceb3727851c02ce1822b3c7b55a977fa4f4c4f2a0e278ca569e

два фрагмента по 64 символа, каждый из которых показан в отдельных строках, могут показаться вам проще.

1 голос
/ 31 мая 2010

Случайные байты вряд ли будут символами Юникода, поэтому я не удивлен, что вы получаете ошибки кодирования. Вместо этого вам нужно как-то конвертировать их. Если все, что вы пытаетесь сделать, это посмотреть, что они из себя представляют, то что-то вроде:

print [ord(o) for o in os.urandom(64)]

Или, если вы предпочитаете, чтобы это было в шестнадцатеричном формате 0-9a-f:

print ''.join( [hex(ord(o))[2:] for o in os.urandom(64)] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...