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:<http://sctrack.sendcloud.net/track/unsubscribe.do?p=eyJ1c2VTk1%3D> 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]: 97 In [10]: bin(97)
Out[10]: '0b1100001' In [11]: '{:>08b}'.format(97) #转2进制
Out[11]: '' In [12]: int('',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进制,对计算机之间和网络数据传输又增深了了解,对之后的网络编程课程部分有很大的帮助。
Python Base64 编码的更多相关文章
- Python base64编码,转图片
我在做火车票抢票器的时候遇到一个问题,就是验证码提取的:一般验证码都是一些http请求的url,但是火车票网站遇到了我没有见过的以data:image/jpg;base64开头的字符串.现在我们就用P ...
- python base64编码和解码图片
简介 在实际项目中,可能需要对图片进行大小的压缩,较为常见的方法则是将图片转换为base64的编码,本文就python编码和解码图片做出一定的介绍. 代码 import base64 import o ...
- Python Base64编码解码
import base64 str = '12345678'.encode('utf8') print(base64.b64encode(str).decode('utf8')) # 编码 接收的参数 ...
- python base64编码实现
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" def encode(b ...
- Python中进行Base64编码和解码
Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...
- Python和shell中Base64编码使用那些事
做开发第一个接触的编码方式就是Base64,当时是用url来传输一些参数,传输的两端会用Base64来编码和解码,保证数据不被url转义破坏. 下面是 维基百科 Base64 中的介绍,其实自己实现起 ...
- python 应用 base64、hmac、hashlib包实现:MD5编码 base64编码解码、SHA256编码、urlsafe_b64encode编码等等基本所有的加密签名的方法
用python做HTTP接口自动化测试的时候,接口的很多参数是经过各种编码加密处理后在传到后台的,这里列举出python实现 应用 base64.hmac.hashlib包实现:md5编码 sha1编 ...
- 自己用 python 实现 base64 编码
自己用 python 实现 base64 编码 base64 编码原理 二进制文件中包含有很多无法显示和打印的字符,二进制的数据一般以 ASCII 码形式(8 bit,即一个字节)存储,8 bit 可 ...
- Python中的Base64编码的加密与解密
Base64 可以干些啥? Base64编码的作用: 由于某些系统中只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法. 图片(and种子)base64 ...
随机推荐
- CMake安装(源码方式)
CMake主页是 https://cmake.org/download/ 一.不指定安装目录方式(不需要配置环境变量) 1.安装必备包(存在的包不用卸载,yum会自动更新) yum install - ...
- WPF 圖表控件 MetroChart
Torsten Mandelkow MetroChart包括以下: ColumnChart(ClusteredColumnChart,StackedColumnChart,StackedColumnC ...
- Ubuntu14.04LTS下安装Node.js&NPM以及个人博客hexo的初始化配置
什么是hexo Hexo 是一款基于node 的静态博客网站生成器作者 :tommy351是一个台湾的在校大学生...相比其他的静态网页生成器而言有着,生成静态网页最快,插件丰富(已经移植了大量Oct ...
- uva242,Stamps and Envelope Size
这题紫薯上翻译错了 应该是:如果有多个并列,输出邮票种类最少的那个,如果还有并列,输出最大面值最小的那个 坑了我一个下午 dp[p][q]==1表示可以用不超过q张组成面额p 结合记忆化,p从1开始枚 ...
- java zip解压
/** * 解压文件到指定目录 * @param zipFile * @param descDir * @author sqdll */@SuppressWarnings("rawtypes ...
- memset和fill_n区别
1. 函数名: memset 所属头文件:<string.h> 用法:void *memset(void *s, char ch, unsigned n); 对于对int之类的数组,只能用 ...
- Promise对象解读
首先强调的是"Promise"是对象,也就是说与其他JavaScript对象的用法,没有什么两样:其次,它起到代理作用(proxy),充当异步操作与回调函数之间的中介.它使得异步操 ...
- 解决phpstorm ftp自动保存文件问题
初次使用phpstorm, 1.配置ftp时,远程文件要用/ftp用户名/文件夹名: 2.由于版本管理的原因(猜测),直接从本地原有文件修改时各种办法都无法上传,结果从服务器上下载一份再修改,解决这个 ...
- Tomcat 服务器及使用Eclipse绑定Tomcat并发布应用
一.简介 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成 ...
- 【初学者必读】能让你月薪过万的5大web前端核心技能
前言Web前端开发所涉及的内容主要包括W3C标准中的结构.行为和表现,那么这三项中我们需要掌握的核心技能是什么呢?看小编来为你揭开谜底的. 1.开发语言 HTML发展历史有二十多年,历经多次版本更新, ...