python base64编码_Python Base64 编码

0x00 Base64简介

0x01 常用场景举例

0x02 编、解码流程

0x03 Python中Base64编码与解码

0x00 Base64简介

我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

此处摘自:https://www.zhihu.com/question/36306744/answer/71626823

编码取值范围:大写字母(A-Z),小写字母(a-z),数字(0-9),特殊字符:'+' 和 '/'  一共64个字符。

0x01 常用场景举例

举例1 :Base64编码最常见于邮件与网页传输中,比如QQ邮箱查看邮件原文就看到邮件原文中的 Content-Transfer-Encoding:base64,邮件最结尾便是base64编码后的内容,比如:

Content-Type:text/html; charset="UTF-8"

Content-Transfer-Encoding:base64

X-SMTPAPI:

List-Unsubscribe:

5oKo5Zyo5Y2a5a6i5Zut5L2/55So5LqG5a+G56CB6YeN572u5Yqf6IO9LCDor7fpgJrov4fkuIvp

naLnmoTlnLDlnYDkv67mlLnlr4bnoIE6PGJyLz48YSBocmVmPSJodHRwczovL3Bhc3Nwb3J0LmNu

YmxvZ3MuY29tL1Jlc2V0U******dvcmQuYXNweD9pZD1mOGIyMzUwMDUwNDM0YzAwYjU2MDZkOWMz

ZTY0MTZkYzIwMTcxMDIxMTgwMjU5ODgxMTkzODIyMjQ2*****+***HM6Ly9wYXNzcG9ydC5jbmJs

b2dzLmNvbS9SZXNldFBhc3N3b3JkLmFzcHg/aWQ9ZjhiMjM1MDA1MDQzNGMwMGI1NjA2ZDljM2U2

NDE2ZGMyMDE3MTAyMTE4MDI1OTg4MTE5MzgyMjI0NjE8L2E+PGJyLz4=

邮件原文:

您在博客园使用了密码重置功能, 请通过下面的地址修改密码:

https://passport.cnblogs.com/ResetPassword.aspx?id=f8b23500******00b5606d9c3e6416dc201710211802598811938222461

举例2:网站 http://pythontutor.com/visualize.html#mode=edit,在网页传输中就使用了base64编码传输图片数据:

此处网页协议传输中就使用了base64来传输图片数据,图片数据原文:

GIF89a!,L;

0x02 编、解码流程

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

6

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

/

这里用两个字母 'ab' 来分析base64 详细的编码流程:

文本

a

b

ASCII编码

97

98

二进制位

0

1

1

0

0

0

0

1

0

1

1

0

0

0

1

0

索引

24

22

8

Base64编码

Y

W

I

=

编码后: YWI=

编码流程:

base64 将两个字节的 'ab ' 看做是3个字节的文本数据

将 'a' 和 'b' 通过ASCII码转为10进制,为别是 97、98、0(补1个0)

将10进制再转换为2进制,分别对应:01100001、01100010、00000000

将3个8位的2进制按每6位分割为4个6位的2进制,分割后:011000、010110、001000    (0010尾部补0凑足6位)

将3个有效的6位2进制转为10进制,即base64编码标的索引号,分别对应:24,22,8

依次将3个10进制的索引号转为对应的字符,便是编码结果:Y、W、I

但是只返回了3个字节的编码结果,所以补上去一个空字节,最终用 '=' 填补上空位,最终组合成4字节字符:YWI=

文本字符 --> 十进制 --> 二进制 --> 每6位切割 --> 切割后的值转为10进制(索引值) --> 转字符

ipython 下测试编码字母 'a':

In [9]: ord('a')

Out[9]: 97In [10]: bin(97)

Out[10]: '0b1100001'In [11]: '{:>08b}'.format(97) #转2进制

Out[11]: '01100001'In [12]: int('00011000',2) #取前6位前面补0再转位10进制,即是base64表索引值24对应字符: Y

Out[12]: 24

解码流程:

编码 --> 转为base64索引值 --> 索引值转6位的2进制 --> 每8位切割转2进制 --> 转10进制 --> 转原文本

0x03 Python中Base64编码与解码

需要导入python 的 base64 库

在python 3 以上版本中需要将字符转位bytes类型,再对其编码或解码

In [1]: import base64

In [2]: str = 'ab'

In [3]: base64.b64encode(str.encode())

Out[3]: b'YWI='

In [4]: str2 = b'YWI='

In [5]: base64.b64decode(str2.decode())

Out[5]: b'ab'

In [6]: base64.b64decode(str2.decode()).decode()

Out[6]: 'ab'

总结:

借助base64编码又回顾了一下 ascii 、2进制、10进制、16进制,对计算机之间和网络数据传输又增深了了解,对之后的网络编程课程部分有很大的帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值