【问题标题】:os.urandom and byte representationos.urandom 和字节表示
【发布时间】:2016-04-09 01:51:43
【问题描述】:

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

10011001

os.urandom(n) 返回一个适合加密使用的随机 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”或“?”这样的字符。或者 '['。输出格式是什么?将像“[”这样的输出转换为二进制的规则是什么?

【问题讨论】:

    标签: python random binary byte


    【解决方案1】:

    这与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 中清楚地查看字节,请遵循上述模式,遍历字符/字节并使用 ord() 显示它们的十进制值。

    【讨论】:

    • 啊,我明白了。 ASCII 表扩展到 127,因此编号为 0 到 127 的位通过它们的 ASCII 表示形式显示,其余位以十六进制打印出来。非常感谢!
    • 这比这更棘手,但是,这是基本的想法。例如,字节 0 到 31 不是“可打印”的,因此也显示为十六进制转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2018-05-10
    • 2019-03-12
    • 1970-01-01
    • 2022-01-18
    • 2020-05-11
    • 2013-02-25
    相关资源
    最近更新 更多