代码之家  ›  专栏  ›  技术社区  ›  Evgeny

Python中的十六进制到字符串格式转换

  •  3
  • Evgeny  · 技术社区  · 16 年前

    我以前用以下方法生成随机字符串(现在我已经切换到 this method )

    key = '%016x' % random.getrandbits(128)
    

    以这种方式生成的键通常是32个字符的字符串,但一旦我有了31个字符。

    这是我不明白的: 为什么是32个字符,而不是16个字符 ?一个十六进制数字不需要打印一个字符吗?

    所以如果我要求 %016x -难道人们不应该期望16个字符可能有前导零吗?

    为什么弦长不总是一样的?

    测试用例

    import random
    import collections
    stats = collections.defaultdict(int)
    for i in range(1000000):
        key = '%016x' % random.getrandbits(128)
        length = len(key)
        stats[length] += 1
    
    for key in stats:
        print key, ' ', stats[key]
    

    印刷品:

    32   937911
    27   1
    28   9
    29   221
    30   3735
    31   58123
    
    2 回复  |  直到 16 年前
        1
  •  6
  •   Alex Martelli    16 年前

    是的,但是您使用的格式不会截断——您生成128个随机位,这需要(通常)显示32个十六进制数字,并且 %016 意味着至少16个十六进制数字,但不只是丢弃显示所有128位数字所需的额外数字。如果你真的需要的话,为什么不生成64个随机位呢?随机生成器的工作更少,没有格式问题。

    为了满足您的好奇心,长度偶尔为31位,因为16位中的1次前4位都是0;实际上256位中的1次前8位都是0,所以您只能得到30位,等等。您只要求16位,因此格式将给出最小的数字,即>=16,不需要截断您没有的数字。要求

        2
  •  3
  •   John Kugelman Michael Hodel    16 年前

    从0到F的每个十六进制字符包含4位信息,或半字节。128位是16个字节,因为打印一个字节需要两个十六进制字符,所以可以得到32个字符。因此,您的格式字符串应该是 '%032x' 它将始终生成32个字符的字符串,而不是更短的字符串。

    jkugelman$ cat rand.py
    #!/usr/bin/env python
    
    import random
    import collections
    stats = collections.defaultdict(int)
    for i in range(1000000):
        key = '%032x' % random.getrandbits(128)
        length = len(key)
        stats[length] += 1
    
    for key in stats:
        print key, ' ', stats[key]
    jkugelman$ python rand.py
    32   1000000