使用 Python 的字节串的密集的、人类可读的表示
Dense, human-readable representation of a string of bytes using Python
我有一堆字节要以人性化的方式输出(使用在任何 font/encoding/etc 中可用和可打印的字符)。在我的例子中,字节是 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 个字符,因为它是十六进制的。如果它使用整个字母表、大写字母、标点符号等,它可以给我一个更短的字符串。我可以通过扩展到十六进制之外来获得更短、更密集的摘要吗?
这是@vaultah 链接到的问题之一的修改版本:
import hashlib, string, base64
_INT_EFFICIENT_CHARS = string.letters + string.digits + string.punctuation
_L_INT_EFFICIENT_CHARS = len(_INT_EFFICIENT_CHARS)
#
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
#
i = int(h.hexdigest(), 16)
print int_efficient(i)
print base64.b64encode(h.digest())
使用我的字母表(94 个字符)仅将结果缩短了相对于 base64 的几个字符:
acbd18db4cc2f85cedef654fccc4a4d8
Hpf=RjPL{_{4Q-[X$vdO
rL0Y20zC+Fzt72VPzMSk2A==
我有一堆字节要以人性化的方式输出(使用在任何 font/encoding/etc 中可用和可打印的字符)。在我的例子中,字节是 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 个字符,因为它是十六进制的。如果它使用整个字母表、大写字母、标点符号等,它可以给我一个更短的字符串。我可以通过扩展到十六进制之外来获得更短、更密集的摘要吗?
这是@vaultah 链接到的问题之一的修改版本:
import hashlib, string, base64
_INT_EFFICIENT_CHARS = string.letters + string.digits + string.punctuation
_L_INT_EFFICIENT_CHARS = len(_INT_EFFICIENT_CHARS)
#
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
#
i = int(h.hexdigest(), 16)
print int_efficient(i)
print base64.b64encode(h.digest())
使用我的字母表(94 个字符)仅将结果缩短了相对于 base64 的几个字符:
acbd18db4cc2f85cedef654fccc4a4d8
Hpf=RjPL{_{4Q-[X$vdO
rL0Y20zC+Fzt72VPzMSk2A==