2

My code is:

print os.urandom(64)

which outputs:

> "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

which isn't readable, so I tried this:

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

but then I get:

> "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

What should I do to get human-readable output?

Michael Mrozek
  • 169,610
  • 28
  • 168
  • 175
zjm1126
  • 63,397
  • 81
  • 173
  • 221

3 Answers3

8

No shortage of choices. Here's a couple:

>>> os.urandom(64).encode('hex')
'0bf760072ea10140d57261d2cd16bf7af1747e964c2e117700bd84b7acee331ee39fae5cff6f3f3fc3ee3f9501c9fa38ecda4385d40f10faeb75eb3a8f557909'
>>> os.urandom(64).encode('base64')
'ZuYDN1BiB0ln73+9P8eoQ3qn3Q74QzCXSViu8lqueKAOUYchMXYgmz6WDmgJm1DyTX598zE2lClX\n4iEXXYZfRA==\n'
Ignacio Vazquez-Abrams
  • 776,304
  • 153
  • 1,341
  • 1,358
2

os.urandom is giving you a 64-bytes string. Encoding it in hex is probably the best way to make it "human readable" to some extent. E.g.:

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

Of course this gives you 128 characters in the result, which may be too long a line to read comfortably; it's easy to split it up, though -- e.g.:

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

two chunks of 64 characters each shown on separate lines may be easier on the eye.

Alex Martelli
  • 854,459
  • 170
  • 1,222
  • 1,395
1

Random bytes are not likely to be unicode characters, so I'm not suprised that you get encoding errors. Instead you need to convert them somehow. If all you're trying to do is see what they are, then something like:

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

Or, if you'd prefer to have it as hex 0-9a-f:

print ''.join( [hex(ord(o))[2:] for o in os.urandom(64)] )
Anthony Briggs
  • 3,395
  • 1
  • 22
  • 12