使用Python的一串字节的密集,人类可读的表示

时间:2015-01-07 18:40:20

标签: python hash hex byte

我想要以人性化的方式输出一堆字节(使用可用的字符并以任何字体/编码等方式打印)。在我的例子中,字节是md5总和的结果:

import hashlib
h = hashlib.md5("foo")

HASH对象有两种方式向我显示其内容。

print h.digest() # Uses a bunch of unprintable characters
print h.hexdigest() # Readable, but 32 characters long

第二个选项为我提供了一个表现良好的字符串,我可以阅读,剪切和粘贴等等。但它是一种低效的表示形式:它只使用16个字符,因为它是十六进制的。如果它使用整个字母,大写字母,标点符号等,它可以给我一个更短的字符串。我可以通过扩展到十六进制以获得更短,更密集的摘要吗?

1 个答案:

答案 0 :(得分:0)

这是@vaultah链接到的问题的答案之一的修改版本:

import hashlib, string, base64

_INT_EFFICIENT_CHARS = string.letters + string.digits + string.punctuation
_L_INT_EFFICIENT_CHARS = len(_INT_EFFICIENT_CHARS)
# http://stackoverflow.com/questions/2267362/convert-integer-to-a-string-in-a-given-numeric-base-in-python
def int_efficient(x):
    rets=''
    while x>0:
        x,idx = divmod(x, _L_INT_EFFICIENT_CHARS)
        rets = _INT_EFFICIENT_CHARS[idx] + rets
    return rets

h = hashlib.md5("foo")
print h.hexdigest()

# Starting in Python 3.2, use int.from_bytes rather than converting to hex
# http://stackoverflow.com/a/9634417/2829764
i = int(h.hexdigest(), 16)
print int_efficient(i)

print base64.b64encode(h.digest())

使用我的字母(94个字符)只会将结果缩短相对于base64的几个字符:

acbd18db4cc2f85cedef654fccc4a4d8
Hpf=RjPL{_{4Q-[X$vdO
rL0Y20zC+Fzt72VPzMSk2A==