我有一个字符串,我正在编码到base64以节省空间。如果我在最后删除等号,这是一个大问题吗?这会显着降低熵吗?我该怎么做才能确保生成的字符串的长度是固定的?
>>> base64.b64encode(combined.digest(), altchars="AB")
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='
感谢。
答案 0 :(得分:17)
您需要编码为Base64的每3个字节转换为4个ASCII字符,并使用'='字符填充结果,以便始终有4个编码字符的倍数。如果你有3个字节的确切倍数,那么你将没有等号。 一个备用字节意味着最后会得到两个'='字符。 两个备用字节意味着你在结尾处得到一个'='字符。 根据您对字符串的解码方式,它可能会或可能不会将其视为有效字符串。使用您拥有的示例字符串,它不会解码,但我尝试过的一些简单字符串会解码。
您可以阅读此页面以更好地理解base64字符串和编码/解码。
http://www.nczonline.net/blog/2009/12/08/computer-science-in-javascript-base64-encoding/
您可以使用免费的在线编码器/解码器检查输出字符串
答案 1 :(得分:14)
查看您的代码:
>>> base64.b64encode(combined.digest(), altchars="AB")
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='
在base64中编码的字符串是名为digest()
的函数的结果。如果您的摘要函数产生固定长度值(例如,如果它正在计算MD5或SHA1摘要),则b64encode的参数将始终具有相同的长度。
如果上述情况属实,则可以删除尾随等号,因为它们的数量始终相同。如果这样做,只需在解码前向字符串添加相同数量的等号。
如果摘要不是固定长度,则修剪等号不安全。
编辑:您可能正在使用SHA-256摘要? SHA-256摘要是256位(或32字节)。 32个字节是10个3的组,加上剩下的2个。正如您将从Wikipedia section on padding中看到的那样;这意味着你总是有一个尾随等于。如果它是SHA-256,那么剥离它是可以的,只要你记得在解码之前再次添加它。
答案 2 :(得分:9)
只要你知道他们做了什么,就可以删除等号。
Base64为其编码的每3个字节输出4个字符(换句话说,每个字符编码6位)。添加填充字符,以便任何base64字符串始终是4的倍数,填充字符实际上不编码任何数据。 (我不能肯定地说为什么这样做 - 作为一种错误检查方法,如果字符串被截断,以便于解码,还是其他什么?)。
在任何情况下,这意味着如果您有x
base64个字符(无填充),则会有4-(x%4)
个填充字符。 (尽管由于6和8的因子分解,x%4=1
永远不会发生。由于这些数据不包含任何实际数据,并且可以恢复,因此当我想节省空间时,我经常将其删除。以下::
from base64 import b64encode, b64decode
# encode data
raw = b'\x00\x01'
enc = b64encode(raw).rstrip("=")
# func to restore padding
def repad(data):
return data + "=" * (-len(data)%4)
raw = b64decode(repad(enc))
答案 3 :(得分:1)
那些是填充,你不会通过删除它们节省太多,因为最多有两个,所以如果你想节省空间,看看其他地方。通过引用熵你压缩这些base64字符串?如果是这样,即使你删除它们,它们也不会对压缩大小产生太大影响。
答案 4 :(得分:1)
除了@Martin Ellis指出的情况之外,弄乱填充字符会导致获得
TypeError: Incorrect padding
并且当你在它的时候产生一些垃圾。
如@MattH所述,base64将与节省空间相反。
要节省空间,您应该应用压缩算法,例如zlib。
例如,zlib
import zlib
s = '''large string....'''
compressed = zlib.compress(s)
compression_ratio = len(s)*1.0/len(compressed)
# And later...
out = zlib.decompress(compressed)
# The above function is also good for relieving stress.
答案 5 :(得分:0)
我不这么认为。 http://en.wikipedia.org/wiki/Base64#Padding
这些等于“有用”