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

python中十六进制到字符串格式的转换,python,string,Python,String,我曾经用下面的方法生成随机字符串(现在我切换到) 以这种方式生成的密钥通常是32个字符的字符串,但一旦我有了31个字符 这就是我不明白的:为什么它是32个字符,而不是16个字符?一个十六进制数字不需要打印一个字符吗 因此,如果我要求使用%016x-难道一个人不应该期望16个字符和可能的前导零吗 为什么字符串长度不总是相同的? 测试用例 印刷品: 32 937911 27 1 28 9 29 221 30 3735 31 58123 是的,但您使用的格式不会截断--您会生

我曾经用下面的方法生成随机字符串(现在我切换到)

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

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

因此,如果我要求使用
%016x
-难道一个人不应该期望16个字符和可能的前导零吗

为什么字符串长度不总是相同的?

测试用例 印刷品:

32   937911
27   1
28   9
29   221
30   3735
31   58123

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


为了满足您的好奇心,长度偶尔是31位,因为16位中的1次,前4位都是0;实际上,256位中有1次前8位都是0,因此只能得到30位,以此类推。您只需要16位,因此格式将给出>=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
32   937911
27   1
28   9
29   221
30   3735
31   58123
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