1
- def encodeBase64 (text ):
2
- base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
3
-
1
+ def encode_base64 (text ):
2
+ r"""
3
+ >>> encode_base64('WELCOME to base64 encoding 😁')
4
+ 'V0VMQ09NRSB0byBiYXNlNjQgZW5jb2Rpbmcg8J+YgQ=='
5
+ >>> encode_base64('AÅᐃ𐀏🤓')
6
+ 'QcOF4ZCD8JCAj/CfpJM='
7
+ >>> encode_base64('A'*60)
8
+ 'QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\r\nQUFB'
9
+ """
10
+ base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
11
+
12
+ byte_text = bytes (text , "utf-8" ) # put text in bytes for unicode support
4
13
r = "" # the result
5
- c = 3 - len (text ) % 3 # the length of padding
14
+ c = - len (byte_text ) % 3 # the length of padding
6
15
p = "=" * c # the padding
7
- s = text + " \0 " * c # the text to encode
16
+ s = byte_text + b" \x00 " * c # the text to encode
8
17
9
18
i = 0
10
19
while i < len (s ):
11
20
if i > 0 and ((i / 3 * 4 ) % 76 ) == 0 :
12
- r = r + "\r \n "
21
+ r = r + "\r \n " # for unix newline, put "\n"
13
22
14
- n = (ord ( s [i ]) << 16 ) + (ord ( s [i + 1 ]) << 8 ) + ord ( s [i + 2 ])
23
+ n = (s [i ] << 16 ) + (s [i + 1 ] << 8 ) + s [i + 2 ]
15
24
16
25
n1 = (n >> 18 ) & 63
17
26
n2 = (n >> 12 ) & 63
18
27
n3 = (n >> 6 ) & 63
19
28
n4 = n & 63
20
29
21
- r += base64chars [n1 ] + base64chars [n2 ] + base64chars [n3 ] + base64chars [n4 ]
30
+ r += base64_chars [n1 ] + base64_chars [n2 ] + base64_chars [n3 ] + base64_chars [n4 ]
22
31
i += 3
23
32
24
33
return r [0 : len (r ) - len (p )] + p
25
34
26
35
27
- def decodeBase64 (text ):
28
- base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
36
+ def decode_base64 (text ):
37
+ r"""
38
+ >>> decode_base64('V0VMQ09NRSB0byBiYXNlNjQgZW5jb2Rpbmcg8J+YgQ==')
39
+ 'WELCOME to base64 encoding 😁'
40
+ >>> decode_base64('QcOF4ZCD8JCAj/CfpJM=')
41
+ 'AÅᐃ𐀏🤓'
42
+ >>> decode_base64("QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\r\nQUFB")
43
+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
44
+ """
45
+ base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
29
46
s = ""
30
47
31
48
for i in text :
32
- if i in base64chars :
49
+ if i in base64_chars :
33
50
s += i
34
51
c = ""
35
52
else :
@@ -43,28 +60,28 @@ def decodeBase64(text):
43
60
if c == "==" :
44
61
p = "AA"
45
62
46
- r = ""
63
+ r = b ""
47
64
s = s + p
48
65
49
66
i = 0
50
67
while i < len (s ):
51
68
n = (
52
- (base64chars .index (s [i ]) << 18 )
53
- + (base64chars .index (s [i + 1 ]) << 12 )
54
- + (base64chars .index (s [i + 2 ]) << 6 )
55
- + base64chars .index (s [i + 3 ])
69
+ (base64_chars .index (s [i ]) << 18 )
70
+ + (base64_chars .index (s [i + 1 ]) << 12 )
71
+ + (base64_chars .index (s [i + 2 ]) << 6 )
72
+ + base64_chars .index (s [i + 3 ])
56
73
)
57
74
58
- r += chr ( (n >> 16 ) & 255 ) + chr ( (n >> 8 ) & 255 ) + chr ( n & 255 )
75
+ r += bytes ([ (n >> 16 ) & 255 ] ) + bytes ([ (n >> 8 ) & 255 ] ) + bytes ([ n & 255 ] )
59
76
60
77
i += 4
61
78
62
- return r [0 : len (r ) - len (p )]
79
+ return str ( r [0 : len (r ) - len (p )], "utf-8" )
63
80
64
81
65
82
def main ():
66
- print (encodeBase64 ("WELCOME to base64 encoding" ))
67
- print (decodeBase64 ( encodeBase64 ("WELCOME to base64 encoding" )))
83
+ print (encode_base64 ("WELCOME to base64 encoding 😁 " ))
84
+ print (decode_base64 ( encode_base64 ("WELCOME to base64 encoding 😁 " )))
68
85
69
86
70
87
if __name__ == "__main__" :
0 commit comments