base64 encode,decode

逛V2ex多了经常看到大神们用奇奇怪怪的字符串来留联系方式。好奇了一个多星期,到底是什么。。

终于鼓起勇气留言问他们这是什么…在很多人的嘲笑声中,还是有位大神耐心解答我的问题,然后建议我学一下base64 编码。从此,开启了新世界的大门。
1、使用Python建立本地base64 encode and decode
用到的模块是 base64;
里面的方法主要用:
encode, decode #专门用来编码和 解码文件的,也可以对StringIO里的数据做编解码;
encodestring, decodestring #专门用来编码和解码字符串;
b64encode, b64decode
urlsafe_b64decode, urlsafe_b64encode

b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什 么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。urlsafe_b64encode和urlsafe_b64decode 一组,这个就是用来专门对url进行base64编解码的,实际上也是调用的前一组函数。
  1. import base64   
  2. text = “hello,world!”  
  3.   
  4. # encodestring(string) and decodestring(string)    
  5. en64text = base64.encodestring(text)  
  6. print (“encode: “ ,en64text) # aGVsbG8sd29ybGQhn

  7. de64text = base64.encodestring(en64text)   
  8. print (“decode: “ ,de64text)  YUdWc2JHOHNkMjl5YkdRaAo=n
输出结果为:
(‘encode: ‘, ‘aGVsbG8sd29ybGQhn’)
(‘decode: ‘, ‘YUdWc2JHOHNkMjl5YkdRaAo=n’)

这就很奇怪了,为什么编码前为”hello,world!”,base64编码再解码,结果却不是”hello,world!”呢?
(另外:对于文件批量处理,source.txt 是源文件,而 result.txt 为编码后的文件)
  1. f1 = open(‘source.txt’‘r’)  
  2. f2 = open(‘result.txt’‘w’)  
  3. base64.encode(f1, f2)  
  4. f1.close()  
  5. f2.close()  
在了解base64编码的过程中,我又发现一个新大陆,叫“安全字符串”,又名urlsafe
  1. text “hello,world!”  
  2. # urlsafe_b64encode(string) and urlsafe_b64decode(string)
  3.   
  4. urlsafe_en64text = base64.urlsafe_b64encode(text)  
  5. print (“url safe encode: “ ,urlsafe_en64text) # aGVsbG8sd29ybGQh
  6.   
  7. urlsafe_de64text = base64.urlsafe_b64decode(urlsafe_en64text)
  8. print (“url safe decode: “ ,urlsafe_de64text) # hello,world!
输出结果为:
(‘url safe encode: ‘, ‘aGVsbG8sd29ybGQh’)
(‘url safe decode: ‘, ‘hello,world!’)
使用urlsafe_decode就对了嘛!
这是为什么???