1. base64编码简介

用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。

Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。Base64是一种用64个字符来表示任意二进制数据的方法,原理很简单,首先,准备一个包含64个字符的数组['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/'] ,然后,对二进制数据进行处理,每3个字节一组,一共是3x8=24bit,划为4组,每组正好6个bit,这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。

每组6位->6位二进制取值范围为:000000-111111(0-63)正好可以取到64个字符

所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

2. python中使用base64

python中直接使用内置包base64即可,base64.b64encode base64.b64decode 分别是编码和解码

import base64
if __name__ == "__main__":bytes_str = b"i love beijing"# 编码# b'aSBsb3ZlIGJlaWppbmc='base64_string = base64.b64encode(bytes_str)print(base64_string)# 解码# b'i love beijing'source_str = base64.b64decode(base64_string)print(source_str)

由于标准的Base64编码后可能出现字符+/,在URL中就不能直接作为参数,所以又有一种url safe 的base64编码,其实就是把字符+/分别变成-_

bytes_str = b"i love tiananmen"
# 编码
base64_string = base64.urlsafe_b64encode(bytes_str)
print(base64_string)
# 解码
source_str = base64.urlsafe_b64decode(base64_string)
print(source_str)

注意:无论是哪种编码方式,输入到base64中的参数都是字节的形式,因此上方中参数byte_str前有个b

3. 应用

将图片(视频)编码成字符串
如下代码,将一张图片编码成字符串,后面我们可以将图片直接以字符串的形式保存到文件中,方便读取,因为有些情况下存取字符串会比直接保存图片方便,比如先把图片存放到数据库中

if __name__ == "__main__":import requestsfrom PIL import Imagefrom io import BytesIOimport base64response = requests.get('https://ts1.cn.mm.bing.net/th/id/R-C.fd4056c8c00979ab8561f8db8219c2ae?rik=JPk67EIYaKIS3A&riu=http%3a%2f%2fimg.mm4000.com%2ffile%2fa%2fa2%2f869bd2bd6a.jpg&ehk=2z%2bPuRHJOYtkm9ICs8fPs0EJbE96jJX2E8QyrVP5kyQ%3d&risl=&pid=ImgRaw&r=0')if response.status_code != 200:raise ValueError("request Error!")# 将请求结果存入io中, 使用PIL以io的方式打开图片img = BytesIO(response.content)pict = Image.open(img)# 改变图像大小,也可是其他操作pict = pict.resize((100, 100), Image.ANTIALIAS)# 将图片存入io中, PIL格式的图片变成byte格式img_buff = BytesIO()pict.save(img_buff, "jpeg")# 使用base64把byte对象编码成字符串img_str = base64.urlsafe_b64encode(img_buff.getvalue())print("image string:", img_str.decode("utf-8"))img.close()# 将字符串解码成图片bytes_image = base64.urlsafe_b64decode(img_str)image_buff = BytesIO(bytes_image)image = Image.open(image_buff)image.show()

结果如下:

python中base64编码相关推荐

  1. 编码以及Python中的编码

    编码 不管是哪种语言,在学习的时候,只要涉及到中文,多多少少都会遇到一些编码问题.然而,说实话,作为一个英语水平没有那么专业的中国人,中文是必不可少的.所以,了解编码以及解码就变得非常重要.下面是从各 ...

  2. python使用base64编码解码数据

    python使用base64编码解码数据 base64模块是用来作base64编码解码,常用于小型数据的传输.编码后的数据是一个字符串,其包括a-z.A-Z.0-9./.+共64个字符,即可用6个字节 ...

  3. python安全编码问题_浅谈Python中的编码问题

    对于Python的初学者来说,编码问题相当令人头疼.本文就根据我在学习过程中遇到的问题简单谈一下Python中的编码.首先简单介绍一下几种常见的编码. 一.几种常见的字符编码 ASCII码 ASCII ...

  4. 浅谈Python中的编码规则

    注:本人用Python3.4作为学习版本,以下学习心得只适用于Python3.4. 之前拜读了金角大王Alex关于编码的解答,收获颇多.特此致谢,以下仅谈一谈作为一个初学者,对编码的理解. 我所了解的 ...

  5. python编码解码单词_在使用w2v时python中的编码问题

    我正在使用word2vec模型在python中编写我的第一个应用程序. 这里是我的简单的代码在使用w2v时python中的编码问题 import gensim, logging import sys ...

  6. Javascript中Base64编码解码的使用实例

    Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...

  7. python中的编码问题

    Python 中的编码问题 在python中遇到编码问题主要来自于ASCII和gbk两个方面.win中python为unicode 编码而控制台一般为gbk编码 ASCII 对于ASCII来说,是由于 ...

  8. python采用的编码是什么意思_深入浅出地,彻彻底底地理解Python中的编码

    python处理文本的功能非常强大,但是如果是初学者,没有搞清楚python中的编码机制,也经常会遇到乱码或者decode error.本文的目的是简明扼要地说明python的编码机制,并给出一些建议 ...

  9. Vue中base64编码和解码

    推荐一个不错的学习资料库 Vue中base64编码和解码 1.在项目更目录下执行命令,安装 npm install --save js-base64 2.在使用的项目引入 let Base64 = r ...

最新文章

  1. Java实现无向图的邻接列表表示,深度遍历及广度遍历
  2. android-sdk-windows下载版
  3. hash表建立 很久没写数据结构了
  4. 【PHP】 数组分页函数、根据字段排序并分页
  5. Python subprocess
  6. JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
  7. Hibernate 查询数据
  8. 程序员的算法课(20)-常用的图算法:最小生成树(MST)
  9. Waymo真·无人车上路了!没司机的出租车推出在即 | 多图实拍
  10. 《正则表达式经典实例(第2版)》——2.18 向正则表达式中添加注释
  11. 对称加密、非对称加密、数字签名、数字证书、签名加密
  12. 基于马尔萨斯的人口模型的一个Logistic模型(MATLAB)
  13. 前端之品优购项目(一)
  14. Windows开启ssh服务配合 IOS 快捷指令完成骚操作
  15. html 给文字加图片背景,如何给文字添加背景图?给文字填充图片背景色的操作方法...
  16. 电脑需要装杀毒软件吗?两个理由看完你做决定
  17. 像西方知识分子那样登场
  18. 计算机准备打印却没动静,打印机显示正在打印但是没反应怎么办?
  19. 这些程序员常用快捷键你了解吗?让你的双手在键盘上起舞
  20. 线程池监控和动态配置

热门文章

  1. 急!标准调制解调器中的计算机间的通讯电缆无法选择端口,调制解调器错误代码一览...
  2. Redis与Memcached的区别
  3. 如何解决不存在的问题
  4. python里感叹号什么意思_感叹号!代表什么意思,标点符号的用法之感叹号
  5. 京东到家交易系统的演进之路
  6. 机器视觉学习之--贝叶斯学习 MATLAB二维正态分布二维图
  7. 数位小孩(数位dp)
  8. 数据分析方法及名词解释总结_(面试)
  9. Java校招极大几率出的面试题(含答案)----汇总
  10. 汇编串操作指令std 和 cld