在Python中存储Base64数据的最节省内存的方式是什么?

4
假设您有一个以Base64编码的MD5哈希值。然后,每个字符在结果为22字节的字符串中只需要6位来存储(不包括结尾的“==”)。因此,每个Base64 MD5哈希可以缩小到6 * 22 = 132位,与原始的8 * 22 = 176位字符串相比,需要少25%的内存空间。
是否有任何Python模块或函数可以让您按上述方式存储Base64数据?

3
既然base64是二进制的ASCII编码,为什么不直接将它存储为二进制数呢?这难道不是最高效的方法吗?(请查看http://docs.python.org/release/2.3/lib/module-base64.html-特别是“decodestring”函数。) - David
我完全意识到我可以为问题中的示例生成一个特定的MD5摘要,它只有16个字节长。但我不限制这个问题只针对MD5。它适用于所有Base64编码的数据。 - OTZ
顺便说一下,那个文档页面可能是针对错误版本的Python...它只是我在谷歌上得到的第一个结果,我没有仔细检查它。 - David
@otz:为什么这是一个MD5摘要还是其他的不重要呢?所有base64编码的数据都应该可以转换为一串字节(当然,并非所有字节都可打印,我也不知道Python如何处理字符串中的NUL字符 - 或者它是否有一种特殊的字节缓冲区类型可以正确地处理它们)。 - David
@David 谢谢。我没有意识到有一个将base64数据解码为二进制的函数。你仍然需要在结尾添加填充(如果你删除了它),比如<code>base64.decodestring(md5_encode('hello')+'==')</code>。但它确实做到了我想做的事情。 - OTZ
@David能否发布一个“答案”,写上“使用decodestring”,这样我就可以接受它并将此问题标记为“已解决”? - OTZ
4个回答

8
将base64编码数据存储为二进制是最有效的方式。base64是一种传输编码,除非你有强烈的理由,否则没有必要将数据存储在其中,特别是在内存中。
另外,挑剔一点:哈希函数的输出不是十六进制字符串——那只是一种常见的表示方式。哈希函数的输出是一些二进制数据的字节数。例如,如果你使用md5、sha或hashlib模块,你根本不需要将其编码为任何东西——只需在哈希对象上调用.digest()而不是.hexdigest()即可。

5

只需将Base64数据解码为二进制:

>>> b64 = "COIC09jwcwjiciOEIWIUNIUNE9832iun"
>>> len(b64)
32
>>> b = b64.decode("base64")
>>> b
'\x08\xe2\x02\xd3\xd8\xf0s\x08\xe2r#\x84!b\x144\x85\r\x13\xdf7\xda+\xa7'
>>> len(b)
24

4

"存储base64数据"

不要这样做。

不要。绝对不要。存储。Base64。数据。

Base64是通过编码某些内容来使其变大。

存储原始的内容。永远不要存储内容的Base64编码。


1

David 给出了一个适用于所有 base64 字符串的答案。

只需在 base64 模块中使用

base64.decodestring
。也就是说,

import base64
binary = base64.decodestring(base64_string)

是原始 base64 字符串的更节省内存的表示。如果您正在截断 base64 md5 中的尾随 '==',请像这样使用它

base64.decodestring(md5+'==')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接