python中base64编码

news2024/11/23 18:52:31

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()

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Perl与JS的对比分析(数组、哈希)

一、数组 可以对数组进行增删,插入。与JS不同的是这些函数都是全局的,JS则是挂在Array.prototype上。 1,对数组尾部的操作pop(删除最后的元素)、push(在尾部添加) 1 2 3 goods qw/pen penci…

[附源码]JAVA毕业设计婚纱影楼服务管理(系统+LW)

[附源码]JAVA毕业设计婚纱影楼服务管理(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

BluePrism里WorkQueue的几种传法和区别

WorkQueue是开发中的好帮手,流程间任务流转非常方便,基本可以取代数据库的场景。 一.循环SourceData单行传入 把Queue的Item Key搭好New Item Data本来为空的collection,每次循环增加一行把Item Key加入New Item Data.Item KeyNew Item Data加…

SpringBoot+Vue实现前后端分离的员工日志管理信息系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

以工程化路径破题,中国系统推动数据要素化

光阴似箭,大数据产业已走过十余载。 如今,人们在各种数字化场景中深刻感受到数据所蕴含的巨大价值,也深深为数据滥用、数据窃取、数据非法交易等各种乱象而担忧。似乎,数据安全与和数据流动、共享与使用已成一对天然的“矛盾”&a…

15.前端笔记-CSS-PS切图

1、图片格式 格式优点jpg同jpeg,产品类图片常用,高清,颜色多gif可以保存成透明背景和动画效果,图片小动画常用,最多存储256色png结合了jpg和gif的优点,保存为背景透明,存储形式丰富psdphotoshop的文件格式…

JMM(Java Memory Model)

Java虚拟机规范中定义了Java内存模型(共享内存模型,实现线程与线程之间的通信,其中主内存是逻辑空间),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果&a…

30张图 讲清楚Redis Cluster

今天下午和一位同学聊Redis集群,这玩意真没那么简单,内容非常多。 Redis Cluster是Redis官方提供的Redis集群功能。 1.为什么要实现Redis Cluster 1.主从复制不能实现高可用 2.随着公司发展,用户数量增多,并发越来越多&#x…

基于微分段的东西向安全防护,如何提升数据中心运维效率?|社区成长营分享回顾

在社区成长营网络与安全第二期分享中,SmartX 高级产品营销经理张涛介绍了原生于超融合系统的微分段防火墙和其工作模式的特点(点击查看第二期图文总结)。 网络与安全第三期分享继续由张涛老师提供,以下为内容回顾。 SmartX 社区成…

品质创未来!流辰信息技术公司实力谱新章!

对于一个企业而言,一辈子用心做好一件事就是对社会最大的贡献。自从深耕于低代码开发平台领域以来,流辰信息技术公司便时刻保持着奋斗和创新的研发心态,不仅增强自主创新能力,而且还积极扩大队伍团队和实力,立志为每一…

【新知实验室-TRTC开发】实时音视频之集美真心话

目录 前言: 一、说说TRTC呗 语音互动直播 语聊房 语音电台 二、成为TRTC的体验官 1、1分钟了解TRTC产品 2、2分钟新手入门 3、别忘了入场券,也别告诉别人哦 三、3分钟完成新应用搭建 1、解压下载源码 2、修改JS文件 3、修改index文件 4、和集…

【Android App】蓝牙的设备配对、音频传输、点对点通信的讲解及实战(附源码和演示 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、蓝牙设备配对 Android提供了蓝牙模块的管理工具,名叫BluetoothAdapter。下面是BluetoothAdapter类常用的方法说明: getDefaultAdapter:获取默认的蓝牙适配器。 getState:获取蓝…

nodejs事件循环

简介 单线程 提到node,我们就可以立刻想到单线程、异步IO、事件驱动等字眼。首先要明确的是node真的是单线程的吗,如果是单线程的,那么异步IO,以及定时事件(setTimeout、setInterval等)又是在哪里被执行的…

Qt “$$“符号的讲解

一.方便调试pro工程 举例方便理解。 在.pro文件中添加如下代码。 编译运行后在“概要信息”可以看到如下结果。 若将$$去掉,则打印的内容为message括号里本身的内容。 保存后可以看到 CSDN QT技术栈大纲:Qt开发必备技术栈学习路线和资料 二.方便其他工…

SpringMVC异常处理

SpringMVC异常简介 系统中异常包括两类:预期异常(检查型异常)和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息, 后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。 系统的 dao、service、controller 出现都通过…

C++ 语言学习 day15 复习 (7)

linux 上面&#xff1a; 操作步骤&#xff1a; 1. 2.找到 share 这个文件夹 3.找到 opencv 这个文件夹 4. 1.今天学习的摄像头 识别 人脸&#xff08; 独立开一个窗口&#xff09; &#xff0c; mian.cpp #include <iostream> #include "opencv2/core/core.hpp…

nnDetection复现Luna16 附模型

前提概要&#xff1a; 淘论文发现nnDetection框架对肺结节的检测效果挺好&#xff0c;便跑了跑复现了下&#xff0c; 作者诚不欺人&#xff0c;确实挺好&#xff0c; 并附上我依据文档训练的模型。 复现步骤&#xff1a; 1.安装 cuda11.4, cudnn8.2.4 2.创建虚拟环境 cond…

JAVA12_01学习总结(MySQL,约束)

今日内容 1. MySql基本查询 --ifnull(字段名称,预期值)-如果两个int类型数据求和,其中一个为null,那么结果就是null,使用ifnull来解决 -- 需求--查询姓名和成绩和 -- 创建表 CREATE TABLE test(id INT , -- 编号NAME VARCHAR(20) , -- 姓名age INT , -- 年龄math INT , -- 数…

html转pdf(总结五种方法Java)

html转pdf&#xff08;总结五种方法Java&#xff09; Java 实现html转pdf&#xff0c;总结五种方法。 推荐使用wkhtmltopdf,Itext 方法一&#xff1a;使用wkhtmltopdf 1、下载插件wkhtmltopdf https://wkhtmltopdf.org/downloads.html 2、本机测试 本目录下cmd进入 输入命…

解读数仓中的数据对象及相关关系

摘要&#xff1a;为实现不同的功能&#xff0c;GaussDB&#xff08;DWS&#xff09;提供了不同的数据对象类型&#xff0c;包括索引、行存表、列存表及其辅助表等。这些数据对象在特定的条件下实现不同的功能&#xff0c;为数据库的快速高效提供了保证&#xff0c;本文对部分数…