我有一个字符串,我编码为base64以节省空间。如果我在最后删除等号是否是一件大事?这会显着减少熵吗?我能做些什么来确保生成的字符串的长度是固定的?可以从base64字符串中删除等号吗?
>>> base64.b64encode(combined.digest(), altchars="AB")
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='
谢谢。
我有一个字符串,我编码为base64以节省空间。如果我在最后删除等号是否是一件大事?这会显着减少熵吗?我能做些什么来确保生成的字符串的长度是固定的?可以从base64字符串中删除等号吗?
>>> base64.b64encode(combined.digest(), altchars="AB")
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='
谢谢。
你的代码看:
>>> 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,只要记得在解码之前再次添加它就可以将其剥离。
它是sha256而不是sha1 – jterrace
你是对的。原始问题中的编码摘要有44个字节。所以我们有256位,即(10个3字节的组)+(剩余2个字节),被编码成11个4字节的组。我已更新我的评论。谢谢。 –
需要用Base64编码的每3个字节都转换为4个ASCII字符,'='字符用于填充结果,以便总是有4个编码字符的倍数。如果你有3个字节的确切倍数,那么你将不会得到等号。 一个备用字节意味着你在最后得到两个'='字符。 两个备用字节意味着你在最后得到一个'='字符。 取决于你如何解码字符串,它可能会或可能不会将此视为有效的字符串。用你有的例子字符串,它不解码,但我尝试过的一些简单的字符串解码。
您可以阅读本页,以便更好地理解base64字符串和编码/解码。
http://www.nczonline.net/blog/2009/12/08/computer-science-in-javascript-base64-encoding/
有免费的在线编码器/解码器,你可以用它来检查你的输出字符串
那些填充和最多有两个人你不将其取出即可节省多少,所以如果你想节省空间看看其他地方。并通过引用熵来压缩这些base64字符串?如果是这样,即使你删除它们,它们也不会对压缩后的大小产生太大影响。
我不这么认为。 http://en.wikipedia.org/wiki/Base64#Padding
这些平等是“有用的”
只要你知道他们做了什么,删除等号就可以了。
Base64每编码3个字节输出4个字符(换句话说,每个字符编码6位)。填充字符被添加以便任何base64字符串总是4的倍数,填充字符实际上不编码任何数据。 (我不能肯定地说为什么这样做 - 作为一种错误检查方式,如果一个字符串被截断,以便于解码或其他?)。
在任何情况下,这意味着如果您有x
base64字符(无填充),则会有4-(x%4)
填充字符。 (虽然x%4=1
永远不会发生,因为分解6和8)。由于这些数据不包含实际数据并且可以恢复,所以当我想节省空间时,我经常将这些数据去掉。以下::
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))
有人有更多的知识,请纠正我的C#版本,如果它不正确:var pad =(text.Length%4);如果(pad == 3)pad = 1; for(int i = 0; i
除了在@马丁埃利斯指出的情况下,用填充字符搞乱,同时你在它导致得到一个
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.
*我有我的编码为base64,以节省空间*字符串 - Base64编码不节省空间,但它确实是相反的。它通常用于表示任意字节序列(通常是基于ascii的)线路协议。 – MattH
只是我惊讶地看到'我编码为base64来节省空间的字符串'? Base64比平均字符串更详细,其更常见的用途是将BINARY数据作为字符串传输。 – jv42
@MattH所以我并不孤单:) – jv42