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 编码的更多相关文章

  1. Python base64编码,转图片

    我在做火车票抢票器的时候遇到一个问题,就是验证码提取的:一般验证码都是一些http请求的url,但是火车票网站遇到了我没有见过的以data:image/jpg;base64开头的字符串.现在我们就用P ...

  2. python base64编码和解码图片

    简介 在实际项目中,可能需要对图片进行大小的压缩,较为常见的方法则是将图片转换为base64的编码,本文就python编码和解码图片做出一定的介绍. 代码 import base64 import o ...

  3. Python Base64编码解码

    import base64 str = '12345678'.encode('utf8') print(base64.b64encode(str).decode('utf8')) # 编码 接收的参数 ...

  4. python base64编码实现

    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" def encode(b ...

  5. Python中进行Base64编码和解码

    Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...

  6. Python和shell中Base64编码使用那些事

    做开发第一个接触的编码方式就是Base64,当时是用url来传输一些参数,传输的两端会用Base64来编码和解码,保证数据不被url转义破坏. 下面是 维基百科 Base64 中的介绍,其实自己实现起 ...

  7. python 应用 base64、hmac、hashlib包实现:MD5编码 base64编码解码、SHA256编码、urlsafe_b64encode编码等等基本所有的加密签名的方法

    用python做HTTP接口自动化测试的时候,接口的很多参数是经过各种编码加密处理后在传到后台的,这里列举出python实现 应用 base64.hmac.hashlib包实现:md5编码 sha1编 ...

  8. 自己用 python 实现 base64 编码

    自己用 python 实现 base64 编码 base64 编码原理 二进制文件中包含有很多无法显示和打印的字符,二进制的数据一般以 ASCII 码形式(8 bit,即一个字节)存储,8 bit 可 ...

  9. Python中的Base64编码的加密与解密

    Base64 可以干些啥? Base64编码的作用: 由于某些系统中只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法. 图片(and种子)base64 ...

随机推荐

  1. vue.js实例对象+组件树

    vue的实例对象 首先用js的new关键字实例化一个vue el: vue组件或对象装载在页面的位置,可通过id或class或标签名 template: 装载的内容.HTML代码/包含指令或者其他组件 ...

  2. android 统计启动时长,标准

    一.启动的类型 冷启 动,application没有被创建,需要先创建进程,然后启动MainActivity.由于这个过程需要fork一个新进程,所以耗时. 热启动,同上面对照,已经启动过applic ...

  3. 使用 Prometheus + Grafana 对 Kubernetes 进行性能监控的实践

    1 什么是 Kubernetes? Kubernetes 是 Google 开源的容器集群管理系统,其管理操作包括部署,调度和节点集群间扩展等. 如下图所示为目前 Kubernetes 的架构图,由 ...

  4. Python连接SQLite数据库

    SQLite作为一款轻型数据库,管理工具有很多,比如SQLite Expert Professional,很适合用来存储Python网站,爬虫的相关数据,下面列出基本的增删查改操作 读取操作: con ...

  5. poi入门之读写excel

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.该篇是介绍poi基本的 ...

  6. 12.21-Android WebService(基于KSOAP2)

    KSOAP2_连接WebService *****我是小知识点******** Ksoap2提供了对soap序列化更好的支持.Ksoap2是一个轻量级的J2ME平台的实现框架,提供了soap协议消息的 ...

  7. MQTT——控制报文格式

    解控制报文格式是学习MQTT中,笔者认为最为重要的一个知识点.MQTT的所有行为都离不开他.控制报文可以分为三个部分组成,分别为:固定报头.可以变报头.有效载荷部分. 注意:上面的说的报文的类型.是指 ...

  8. Maven项目构建管理

    一.Maven的作用 在开发中,为了保证编译通过,我们会到处去寻找jar包,当编译通过了,运行的时候,却发现"ClassNotFoundException",我们想到的是,难道还差 ...

  9. Go Global 之怎样在全球Azure上使用Azure Free Account

    随着中国用户出海的越来越多,同学们自学Azure Global 功能的积极性也越来越高.怎样开启Azure Global 账号,有哪些Global Azure的功能可以免费使用,能不能用国内的信用卡和 ...

  10. Java语言写出水仙花数,

    package com.llh.demo;/** * 水仙花数 * @author llh * */public class Demo14 {    public static void main(S ...