os.urandom 和字节表示

os.urandom and byte representation

我有一个非常基本的问题,关于 python2 中 os.urandom 的输出格式,以及更一般的字节表示。一个字节是 8 位,因此例如在二进制中,一个特定的单个字节将是:

10011001

os.urandom(n) returns 适合加密用途的随机 n 字节字符串。如果我打印出对 os.urandom(1) 的少量调用,只生成一个字节,我会发现类似:

'\x1f', '\xa0', '#', '\xa4', "'", '\xa8', '+', '\xac', '/', '\xb0', '3', '\xb4', '7', '\xb8', ';', '\xbc', '?', '\xc0', 'C', '\xc4', 'G', '\xc8', 'K', '\xcc', 'O', '\xd0', 'S', '\xd4', 'W', '\xd8', '['

所以 urandom() 似乎不是将一个字节表示为 8 位,而是表示为 2 位十六进制数(当然两者都有意义,因为 2^8 = 16^2)。我的困惑是上面只有一些是 2 位十六进制数字,还有像 'S' 或 '?' 这样的字符。要么 '['。输出格式是什么?将“[”之类的输出转换为二进制的规则是什么?

它真的与 os.urandom 没有任何关系 - 这只是 repr() 作用于所有字符串的方式。像这样:

>>> for ch in "\x1f\xa0#+\x01":
...     print("%6s %3d" % (repr(ch), ord(ch)))
'\x1f'  31
'\xa0' 160
   '#'  35
   '+'  43
'\x01'   1

一般来说,如果一个字节对应于一个可打印的 ASCII 字符,repr 显示该字符,否则会产生一个十六进制 \x 转义。

要清楚地看到 Python 2 中的字节,请按照上面的模式迭代 characters/bytes 并使用 ord() 显示它们的十进制值。