BASE64介绍
该算法被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式,达到一眼望去完全看不出内容。此算法的复杂程度要小,效率高。如果是基于以上两点,那么我们使用最简单的单字母代替法等即可,实际上Base64要稍微复杂些,这是因为在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。
编码规则
把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),再根据每个字节的值,用base64编码表中的值替换,不足4个字节的,补“=”。编码得到的字符串长度必为4的倍数。
常规base64编码表范围为 [A-Za-z0-9+/] 共64个字符,在实际应用时编码表经常会有所变化。=号为填充字符。
Base64编码表序列是由0开始到63结束的,共64个字符。
Base64编码表
序列值 | 对应编码 | 序列值 | 对应编码 | 序列值 | 对应编码 | 序列值 | 对应编码 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 9 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
编码步骤:
1、 将待编码字符串各个字符换为对应ASCII码值
2、 将得到的ASCII码值转换为8位二进制
3、 将得到的8位二进制序列分割为6位一组(不足6位的末尾添0补上)
4、 将每个6位二进制数列转换为十进制数字。(6位二进制最大值为63)
5、将转换所得的十进制值对应Base64编码表中的字符进行替换
6、若编码所得字符串长非4倍,添一个或两个“=”补上
解码步骤:
1、将待解码字符串中的字符对应查找Base64编码表中的序列值(末尾的“=”直接忽略)
2、将所得对应序列值转换为6位二进制字串
3、将所有6位二进制字串按8位分割
4、将每个8位二进制字串转换为十进制
5、十进制值对应的ASCII字符串即为结果
示例(待编码字符长度刚好为3的倍数):
示例(待编码字符长度无法被3整除):
python实现
base64_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
def btoa(): # base64编码函数
s = input("input string to encode:\n")
n = len(s) % 3
x = ''
asc = []
for i in range(len(s)):
asc.append(ord(s[i])) #取各字符ascii值
x += '{:08b}'.format(asc[i]) #将各字符ascii值转为二进制
if n:
x += '0'*2 *(3-n) #长度非3倍的结尾补零
i = 0
out = ''
while i<len(x):
out += base64_table[int(x[i:i+6],2)]
i += 6
if n:
out += '=' *(3-n) #补上'='使编码后长度为4倍
print(out)
def atob(): #base64解码函数
s = input("input string to decode:\n")
b64 = []
x = ''
for i in range(len(s)):
if s[i] == '=':
b64.append(0)
else:
for j in range(64):
if(s[i] == base64_table[j]):
b64.append(j)
break
x += '{:06b}'.format(b64[i])
print(x)
i = 0
out = ''
while i<len(x):
if int(x[i:i+8],2):
out += chr(int(x[i:i+8],2))
i += 8
print(out)
def main():
m = input('Input 1/2 to encode/decode:\n')
if m == '1':
btoa()
elif m == '2':
atob()
else:
print('Error! Please restart the process!')
main()
参考博文: