如何在我的代码中显示正确的单词,我的代码是:os.urandom(64)
我的代码是:
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 个回答
1
随机字节通常不会是unicode字符,所以你遇到编码错误我并不感到惊讶。你需要以某种方式将它们转换。如果你只是想看看这些字节是什么,那么可以使用类似下面的代码:
print [ord(o) for o in os.urandom(64)]
或者,如果你想把它们以十六进制(0-9和a-f)显示,可以使用:
print ''.join( [hex(ord(o))[2:] for o in os.urandom(64)] )
2
os.urandom会给你一个64字节的字符串。把它转成十六进制的形式可能是让它“人类可读”的最佳方式。比如:
>>> s = os.urandom(64)
>>> s.encode('hex')
'4c28351a834d80674df3b6eb5f59a2fd0df2ed2a708d14548e4a88c7139e91ef4445a8b88db28ceb3727851c02ce1822b3c7b55a977fa4f4c4f2a0e278ca569e'
当然,这样会得到128个字符的结果,可能一行太长不太好读;不过,分开来看会更简单一些——比如:
>>> print s[:32].encode('hex')
4c28351a834d80674df3b6eb5f59a2fd0df2ed2a708d14548e4a88c7139e91ef
>>> print s[32:].encode('hex')
4445a8b88db28ceb3727851c02ce1822b3c7b55a977fa4f4c4f2a0e278ca569e
将两个64个字符的部分分别显示在不同的行上,可能会让人看起来更舒服。
8
选择可真不少。这里有几个例子:
>>> os.urandom(64).encode('hex')
'0bf760072ea10140d57261d2cd16bf7af1747e964c2e117700bd84b7acee331ee39fae5cff6f3f3fc3ee3f9501c9fa38ecda4385d40f10faeb75eb3a8f557909'
>>> os.urandom(64).encode('base64')
'ZuYDN1BiB0ln73+9P8eoQ3qn3Q74QzCXSViu8lqueKAOUYchMXYgmz6WDmgJm1DyTX598zE2lClX\n4iEXXYZfRA==\n'