首页 > 技术文章 > base64的python实现

masako 2017-04-12 09:54 原文

写了一个函数,自己按照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字符串才会得到正确的结果.

 

推荐阅读