2024-05-12 18:42:49 发布
网友
我有一个字符串要编码成base64以节省空间。我去掉结尾的等号有什么大不了的吗?这会显著降低熵吗?如何确保生成的字符串的长度是固定的?
>>> base64.b64encode(combined.digest(), altchars="AB") 'PeFC3irNFx8fuzwjAzAfEAup9cz6xujsf2gAIH2GdUM='
谢谢。
查看代码:
在base64中编码的字符串是名为digest()的函数的结果。如果digest函数产生固定长度值(例如,如果它计算MD5或SHA1 digest),那么b64encode的参数将始终是相同的长度。
digest()
如果以上是真的,那么可以去掉后面的等号,因为它们的数目总是相同的。如果这样做,只需在解码前在字符串中附加相同数量的等号。
如果摘要不是固定的长度,那么修剪等号是不安全的。
编辑:您可能正在使用SHA-256摘要?SHA-256摘要是256位(或32字节)。32字节是10组3,加上2个剩余字节。从Wikipedia section on padding中可以看出,这意味着您总是有一个尾随的等于。如果是SHA-256,那么可以去掉它,只要你记得在解码之前再加一次就行了。
去掉等号是可以的,只要你知道它们的作用。
Base64每编码3个字节输出4个字符(换句话说,每个字符编码6位)。填充字符的添加使得任何base64字符串的长度始终是4的倍数,填充字符实际上不会对任何数据进行编码。(我不能肯定为什么这样做-作为检查字符串是否被截断、简化解码或其他操作的一种错误方式?)。
无论如何,这意味着如果有xbase64个字符(无填充),则将有4-(x%4)填充字符。(尽管x%4=1不会因为6和8的因子分解而发生)。由于这些数据不包含实际数据,并且可以恢复,因此当我想节省空间时,我经常删除这些数据,例如:
x
4-(x%4)
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))
需要编码为Base64的每3个字节转换为4个ASCII字符,并使用“=”字符填充结果,以便始终有4个编码字符的倍数。如果你有一个3字节的精确倍数,那么你将不会得到等号。 一个空闲字节意味着在结尾处有两个“=”字符。 两个空闲字节意味着您在末尾得到一个“=”字符。 根据您对字符串的解码方式,它可能会或可能不会将其视为有效字符串。对于你的示例字符串,它不会解码,但我尝试过的一些简单字符串会解码。
为了更好地理解base64字符串和编码/解码,您可以阅读本页。
http://www.nczonline.net/blog/2009/12/08/computer-science-in-javascript-base64-encoding/
有免费的在线编码器/解码器,您可以用来检查您的输出字符串
查看代码:
在base64中编码的字符串是名为
digest()
的函数的结果。如果digest函数产生固定长度值(例如,如果它计算MD5或SHA1 digest),那么b64encode的参数将始终是相同的长度。如果以上是真的,那么可以去掉后面的等号,因为它们的数目总是相同的。如果这样做,只需在解码前在字符串中附加相同数量的等号。
如果摘要不是固定的长度,那么修剪等号是不安全的。
编辑:您可能正在使用SHA-256摘要?SHA-256摘要是256位(或32字节)。32字节是10组3,加上2个剩余字节。从Wikipedia section on padding中可以看出,这意味着您总是有一个尾随的等于。如果是SHA-256,那么可以去掉它,只要你记得在解码之前再加一次就行了。
去掉等号是可以的,只要你知道它们的作用。
Base64每编码3个字节输出4个字符(换句话说,每个字符编码6位)。填充字符的添加使得任何base64字符串的长度始终是4的倍数,填充字符实际上不会对任何数据进行编码。(我不能肯定为什么这样做-作为检查字符串是否被截断、简化解码或其他操作的一种错误方式?)。
无论如何,这意味着如果有
x
base64个字符(无填充),则将有4-(x%4)
填充字符。(尽管x%4=1
不会因为6和8的因子分解而发生)。由于这些数据不包含实际数据,并且可以恢复,因此当我想节省空间时,我经常删除这些数据,例如:需要编码为Base64的每3个字节转换为4个ASCII字符,并使用“=”字符填充结果,以便始终有4个编码字符的倍数。如果你有一个3字节的精确倍数,那么你将不会得到等号。 一个空闲字节意味着在结尾处有两个“=”字符。 两个空闲字节意味着您在末尾得到一个“=”字符。 根据您对字符串的解码方式,它可能会或可能不会将其视为有效字符串。对于你的示例字符串,它不会解码,但我尝试过的一些简单字符串会解码。
为了更好地理解base64字符串和编码/解码,您可以阅读本页。
http://www.nczonline.net/blog/2009/12/08/computer-science-in-javascript-base64-encoding/
有免费的在线编码器/解码器,您可以用来检查您的输出字符串
相关问题 更多 >
编程相关推荐