python中base64编码简介
作者:orangerfun 发布时间:2023-09-21 20:26:12
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 requests
from PIL import Image
from io import BytesIO
import base64
response = 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()
结果如下:
来源:https://blog.csdn.net/orangerfun/article/details/128090128
猜你喜欢
- 那是一杠还是两杠呢?最简单的方式就是拿出钱包,掏出张“新”的50或100,翻到背面的银线上,就会发现两杠的符号。这个是以前跟同事在讨论是一杠
- 打开VB6,新建ActiveX DLL 2、在工程引用中加入Microsoft Active Server Pages Object Lib
- 1. A List Apart CSS TopicsA List Apart是一个CSS优秀文章的收集网站,从1999年开始收集文章,关注最
- 1. viper的介绍viper是go一个强大的流行的配置解决方案的库。viper是spf13的另外一个重量级库。有大量项目都使用该库,比如
- unittest是python的一个单元测试框架关于断言它是用于对一个确定结果和预测结果的一种判断,如果结果正确无任何返回效果,如果结果错误
- 1、先介绍如何用PHP连上数据库(数据库用户名“root”,密码“sun”,有库“myguestbook”) 图62、PHP和My
- 昨天去面试,百度题果然不一样,笔试我就蒙了,现在能记住两道题,笔试:1、title和alt 区别2、三列布局 左边裂固定宽度左对齐,右边列固
- 内容摘要:网页设计师制作网页最常用的设计软件应该就算adobe的产品Photoshop了,当然Photoshop不仅可以设计网页,不过作为网
- 由于现在在公司负责制作标准的静态页面,为了增强客户体验,所以经常要做些AJAX效果,也学你也和我一样在,学习AJAX。而设计AJAX时使用的
- 当我们准备建立一个Web站点时,就必须向域名登记机构申请一个Internet域名,因此,我们通常希望了解自己准备使用的域名是否已经被注册,这
- 本文主要介绍了ASP连接11种数据库的常用语法,详细内容请参考下文:1.Access数据库的DSN-less连接方法:set adocon=
- 使用select @@identity 得到刚插入数据的ID1.适用于所有 ADO 版本<%Dim loConn, 
- 这里的等价不是说function的toString相同,也不是说function的引用相同,而是说对于两个function A和B,如果它们
- 一 简单介绍wxpy基于itchat,使用了 Web 微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。实现了微信
- 程序开始:<% Server.ScriptTimeout = &HE10 '&
- <script language="javascript">function chang
- PDO::inTransactionPDO::inTransaction — 检查是否在一个事务内(PHP 5 >= 5.3.3, B
- 这篇文章主要介绍了Python argparse模块应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 引言除非您正在对服务进行原型设计,否则您可能会关心应用程序的内存使用情况。内存占用更小,基础设施成本降低,扩展变得更容易/延迟。尽管 Go
- 页面加载loading效果, 这个挺好玩的!用setTimeout实现的!可以和服务端整合弄一些生成HTML或者上传文件等应用!