python学习笔记7.4-内建模块base64

有时候,我们用noepad++或者记事本打开图片或者程序等文件的时候会显示大量的乱码,主要原因是这些文件编码的时候并不是字符串编码的。如果我们想把这些文件正常显示为字符,这个时候就可以用到base64,它就是一种编码、解码的规则。 正式介绍一下base64的原理: (1)准备一个包含64个字符的数组:

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']

(2)对二进制数据进行处理,每3个字节一组,一共是3x8=24bit,划为4组,每组正好6个bit:2^6 = 64,刚好可以用来索引(创造这个规则的人真是聪明)。如果字符数量不是3的整数倍,在最后补上0x/00,并用=或者==来表示。

所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。 还是实例具有说服力:

In [1]: import base64

In [2]: string1 = base64.b64encode(b'nihaoa')

In [3]: string1
Out[3]: b'bmloYW9h'

In [4]: string2 = base64.b64encode(b'nihao')

In [5]: string2
Out[5]: b'bmloYW8='

In [6]: string3 = base64.b64encode(b'niha')

In [7]: string3
Out[7]: b'bmloYQ=='

第一个刚好是3的整数倍,第二个差一个,所以补了=,第三个差2个所以补了2个==

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

>>> base64.b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd++//'
>>> base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd--__'
>>> base64.urlsafe_b64decode('abcd--__')
b'i\xb7\x1d\xfb\xef\xff'

base64还可以自己定义字符顺序,这样就可以用来加密了,有兴趣可以自己玩一把。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏calmound

ZOJ 2724 Windows Message Queue(优先队列)

优先队列的概念及使用方法 题意:输入GET,队列为空则输出空,否则输出最优先的数据(所谓最优先,就是优先值最小的一个),若输入PUT,输入三个数据,分别是名字,...

3485
来自专栏小二的折腾日记

day5(面向对象2)

缓冲区的出现是为了提高流的操作效率而出现的。所以在创建缓冲区之前,必须要先有流对象。 为了 提高字符写入流效率,加入了缓冲技术,只要将需要提高效率的流对象作为参...

392
来自专栏mukekeheart的iOS之旅

OC学习9——反射机制

1、OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作。 通过NSObje...

2625
来自专栏desperate633

设计模式之访问者模式(visitor模式)引入访问者模式visitor模式的实例visitor模式分析

Visitor是访问者的意思。 数据结构中保存着元素。一般我们需要对元素进行处理,那么处理元素的代码放在哪里呢?最显然的方法就是放在数据结构的类中,在类中添加...

703
来自专栏博岩Java大讲堂

Java虚拟机--虚拟机内存区域Java虚拟机内存区域

2698
来自专栏漫漫深度学习路

tensorflow:上下文管理器 与 name_scope, variable_scope

tensorflow的上下文管理器,详解name_scope和variable_scope with block 与上下文管理器 上下文管理器:意思就是,在这个...

2726
来自专栏技巅

Thrift之代码生成器Compiler原理及源码详细解析2

1945
来自专栏nummy

Python中getattr、__get__、__getattr__和__getattribute__的区别

getattr (object, name[, default])是Python的内置函数之一,它的作用是获取对象的属性。

701
来自专栏编程

PHP漏洞函数总结

1.MD5 compare漏洞 PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不...

2237
来自专栏大闲人柴毛毛

深入Java虚拟机——JVM内存详解

在C++中,程序员拥有每一个对象的所有权,但与此同时还肩负着释放对象内存空间的责任;而Java由于有了虚拟机的帮助,程序员拥有对象的所有权的同时不再需要释放对象...

34013

扫码关注云+社区