写了一个函数,自己按照base64的规则转换一个字符串.
1 # /usr/bin/python 2 # encoding: utf-8 3 base64_table = ['A', 'B', 'C', 'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 4 'a', 'b', 'c', 'd','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 5 '0', '1', '2', '3','4','5','6','7','8','9', 6 '+', '/', '='] 7 8 def encode_b64(s): 9 l = len(s) 10 i = 0 11 result = '' 12 while i < l: 13 # 将字符转换为二进制编码,然后对齐 14 s1 = s[i] 15 b1 = bin(ord(s1))[2:] 16 cb1 = b1.rjust(8, '0') 17 18 i += 1 19 if i >= l: 20 cb2 = '00000000' 21 else: 22 s2 = s[i] 23 b2 = bin(ord(s2))[2:] 24 cb2 = b2.rjust(8, '0') 25 26 i += 1 27 if i >= l: 28 cb3 = '00000000' 29 else: 30 s3 = s[i] 31 b3 = bin(ord(s3))[2:] 32 cb3 = b3.rjust(8, '0') 33 34 # 将三字节转换为四字节 35 cb = cb1 + cb2 + cb3 36 37 rb1 = cb[:6] 38 rb2 = cb[6:12] 39 rb3 = cb[12:18] 40 rb4 = cb[18:] 41 42 # 转换后的编码转为十进制备用 43 ri1 = int(rb1, 2) 44 ri2 = int(rb2, 2) 45 ri3 = int(rb3, 2) 46 ri4 = int(rb4, 2) 47 48 # 处理末尾为0的情况,以'='填充 49 if i - 1 >= l and ri3 == 0: 50 ri3 = -1 51 52 if i >= l and ri4 == 0: 53 ri4 = -1 54 55 result += base64_table[ri1] + base64_table[ri2] + base64_table[ri3] + base64_table[ri4] 56 57 i += 1 58 59 return result
基本没什么算法,无脑迎合base64的规则即可.
自己的用处主要是将网页上的btoa转换的字符串,自己转换一遍,方便爬虫模拟发送数据.
为什么不用python自带的base64模块?
因为经过自己的测试,发现python的base64模块加密出来的数据和js的base64加密的结果不一样,百度的各种base64在线编码和python结果是一样的.猜想是由于语言内部的编码方式不一样.也查过一些资料,有的其他语言也有这种情况,但都没有提出好的解决办法,只好自己动手,虽然代码很挫,用起来还是不错的.
这份代码python2和python3都可以用,python3传入字符串即可,python2需要传入u''开头的,也就是unicode字符串才会得到正确的结果.