python与base64

一、base64编码工作原理

base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。它可以把不能作为文本显示的二进制数据编码为可显示的文本信息。base64怎么工作的呢?把N字节的内容对应的8*N位, 每6位砍成1段,得到 (8*N)/6 个单元,每个单元的值,都在[0,63]之间,再把其值对应1个ascii字符,拼接起来,OK!这里以base64_encode(’PHP’) ==> ‘UEhQ’, 编码过程如下(点击图片看大图):

base64_encode

从上面的图中也可以看出,其编码后,由三个字符串变成了四个,而位长也由6位变成8位,所以其进行base64编码后,文件或字符串的大小会增加33%左右。

二、python下的base64模块

python下的base64模块主要有8个方法(encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode):

 

  • encode,decode:用来编码和 解码文件的,也可以对StringIO里的数据做编解码
  • encodestring,decodestring:用来编码和解码字符串
  • b64encode和b64decode:用来编码和解码字符串,并且有一个替换符号字符的功能
  • urlsafe_b64encode 和urlsafe_b64decode:这个就是用来专门对url进行base64 编解码的,其实际调用了b64encode和b64decode。

1、编码解码字符串

 

 
  1. >>> import base64
  2. >>> s='abcd'
  3. >>> base64.encodestring(s)
  4. 'YWJjZA==\n'
  5. >>> x = base64.encodestring(s)
  6. >>> base64.decodestring(x)
  7. 'abcd'

2、编码解码文件

 

 
  1. f1 = open('aaa.txt', 'r')
  2. f2 = open('bbb.txt', 'w')
  3. base64.encode(f1, f2)
  4. f1.close()
  5. f2.close()

3、urlsafe编码

 

 
  1. >>> url='http://www.361way.com'
  2. >>> base64.urlsafe_b64encode(url)
  3. 'aHR0cDovL3d3dy4zNjF3YXkuY29t'
  4. >>> x=base64.urlsafe_b64encode(url)
  5. >>> len(x)
  6. 28
  7. >>> base64.urlsafe_b64encode('http://www.361way.com/t')
  8. 'aHR0cDovL3d3dy4zNjF3YXkuY29tL3Q='
  9. >>> base64.urlsafe_b64decode(x)
  10. 'http://www.361way.com

b64encode和b64decode提供了字符串替换功能,而urlsafe_b64encode 和urlsafe_b64decode默认帮我们替换了+和/两个符号,因为其在URL中有特殊意义(The alphabet uses '-' instead of '+' and '_' instead of '/'.)。

4、等号的处理

从上面的图中我们可以看出base64编码里有两个特殊的字符+/(ASCII码128个,base编码64个)。而=号是为了补全位能被4整除,因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数。那这个等号能不能去掉呢?因为等号在URL、cookie里可能会有歧义。实际上是可以的,但需要计算处理,可以进行如下封装:

 

 
  1. def b64_url_decode(str):
  2. return base64.b64decode(str+'='*(4-len(str)%4))
  3. def b64_url_encode(scode):
  4. return base64.urlsafe_b64encode(str(scode)).rstrip('=')

应用示例如下:

 

 
  1. >>> s='abcd'
  2. >>> base64.encodestring(s)
  3. 'YWJjZA==\n'
  4. >>> def b64_url_decode(str):
  5. ... return base64.b64decode(str+'='*(4-len(str)%4))
  6. ...
  7. >>> b64_url_decode('YWJjZA')
  8. 'abcd'

可以看到,我把后面的两个等号去掉了,一样可以正常解码出来。因为其在解码前,先补全了等号的位。而且这个位长是一定要补的,因为不能被4整除会爆出异常的。

三、base64与图片

base64也可以编码二进制文件,如邮件中的图片和附件。编码后,我们可以在网页或邮件的源码里,直接体现此图片,而不必把图片放在服务器上,其跟处理普通文件一样。 例如如下的图片,我并没有上传到服务器上,就是通过base64 encode进行处理后,直接引用的。

其代码你可以查看源代码找到<img src="data:image/png;base64 进行查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值