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()
显示它们的十进制值。
我有一个非常基本的问题,关于 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()
显示它们的十进制值。