base64编码解码原理
计算机只能处理数字,所以要处理任何文本,只能先将文本转化为数字才行。
Bit(bit)(b) 位或比特,是计算机运行的基础,属于二进制的范畴。数据传输大多是以【位】为单位,一个位即代表一个0或者1(即二进制),每8个位组成一个字节。
Byte(B)字节,是计算机中文件大小的基本计量单位。数据存储就是以字节为单位。1B = 8b。所以一个字节最大能表述的数字是255【11111111】
编码:
ASCII编码:1个字节,所以只能处理英文数字和一些符号。
UNICODE编码:通常是2个字节,它把所有语言都统一到一套编码中,因此解决了乱码问题,但是随之而来的是,存储空间的浪费。如文中大量的英文,每个字符都需要2个字节的存储空间
UTF8编码:UTF8结合了二者的优缺点,它是可变长编码方式。它把一个UNICODE字符根据不同的数字大小,编码成1--6个字节,常用英文字母为1个字节,汉字通常3个字节。
在计算机内存中,通常采用Unicode编码,在需要保存到硬盘或需要传输的时候,就转化为utf8。
python中,提供了ord()函数获取字符的整数表示。
BASE64编码由64个字符组成,编码后的字符由表中字符组合而成,具体流程如下:
1)base64编码都是按照字符串长度分组,以每3个8位字节为一组,不足3个一组的,补0,编码完成后补=
2)获取每组的每个字符的ASCII码
3)将ASCII码转化为8位的二进制,即每组为3*8=24位的长度
4)将24位划分为4个6位的字节,并在每个6位字节前补2个0,重新组成8位的字节
5)将新组成的8位的字节转化为十进制,查找对应的base64编码表。
用代码表示如下(以下只支持英文直接转化):
import string
base64_char = string.ascii_uppercase + string.ascii_lowercase + string.digits+'+/' # base64编码表
def decode(s):
num = 0 if (3-len(s)%3)==3 else (3-len(s)%3) # 分组后不足待补齐的个数
new_s = ["{:0>8}".format(bin(ord(i)).replace("0b","")) for i in s] # 将字符串转化为8为的二进制
new_s ="".join( [new_s.append("0"*8) for x in range(num)]) # 对于不足3个分组的,补齐0
num1 = int(new_s/6) # 重新以6位为一组,可以分的组数量
new_s = ["{:0>8}".format(new_s[i*6:(i+1)*6]) for i in range(num1)] # 将新的分组补齐为8位
new_s = [int(x,2) for x in new_s] # 将新的二进制转化为10进制
result = "".join([base64_char[i] for i in new_s])+"="*num # 对应的查编码表并补齐=
print(result)
对应的解码,即将上面的函数反向执行:
def decode(s):
while s[-2:-1]=="=":
s = s.replace("=","") # 将补齐的=号去掉
s1 = ["{:0>6}".format(bin(base64_char.index(x)).replace("0b","")) for x in s] # 查找编码表,找到对应的位置,并转化为二进制
s1 = "".join(s1)
num = len(s1)//8 # 计算出分组数量
s2 = [s1[x*8:(x+1)*8] for x in range(num)] # 转化为8位一组的字节
s2 = [chr(int(s1[index],2)) for index in range(num)]
result = "".join(s2)
print(result)
base64编码解码原理的更多相关文章
- 【学习笔记】Base64编码解码原理及手动实现(C#)
1.[Base64编码原理]@叶落为重生 -base64的编码都是按字符串长度,以每3个8bit的字符为一组,-然后针对每组,首先获取每个字符的ASCII编码,-然后将ASCII编码转换成8bit的二 ...
- C# Base64编码/解码
一.编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据分成4 ...
- Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net
Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码, 1 1.1. 子模式 urlsafe Or url ...
- Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net
Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or url u ...
- 《PHP 实现 Base64 编码/解码》笔记
前言 早在去年 11 月底就已经看过<PHP 实现 Base64 编码/解码>这篇文章了,由于当时所掌握的位运算知识过于薄弱,所以就算是看过几遍也是囫囵吞枣一般,不出几日便忘记了其滋味. ...
- OpenSSL 使用 base64 编码/解码
简述 关于 OpenSSL 的介绍及安装请参见:Windows下编译OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #incl ...
- 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Javascript中Base64编码解码的使用实例
Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...
- base64编码的原理及实现
base64编码的原理及实现 我们的图片大部分都是可以转换成base64编码的data:image. 这个在将canvas保存为img的时候尤其有用.虽然除ie外,大部分现代浏览器都已经支持原生的基于 ...
随机推荐
- Spring入门详细教程(四)
前言 本篇紧接着spring入门详细教程(三),建议阅读本篇前,先阅读第一篇,第二篇以及第三篇.链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/ ...
- c/c++ static关键字
static关键字 1,static 成员变量 static 成员变量不随着对象的创建而开辟内存空间.也就是说,不管从哪个对象去看static成员变量,都是一样的. 2, static 成员方法 st ...
- Windows Server 2016-清理残留域控信息
本章紧接上文,当生产环境中域控出现问题无法修复以后,一方面我们需要考虑抢夺FSMO角色,另一方面我们需要考虑的问题是清理当前域控的残留信息,以防止残留数据信息导致用户验证或者解析异常等问题.本章讲到如 ...
- 常用的几条sql语句
### 常用的几条sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,v ...
- This network connection does not exist
This network connection does not exist 在windows server 2008上面map了一个磁盘,共享的folder被我停止共享后,点击该磁盘的disconn ...
- Session变量在PHP中的使用
PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置.Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用. PHP Session 变量 当您运行一个 ...
- 一张有料的图片!!!附文件-图片合成器C语言实现算法
凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.打开F盘,先找两个文件,一个是压缩文件(2.rar),另一个是一张图片(1.jpg),将其放到F盘目录下, ...
- 基于Django rest framework 和Vue实现简单的在线教育平台
一.基于api前端显示课程详细信息 1.调整Course.vue模块 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ...
- css样式的书写顺序及原理
刚开始学习前端的时候,每次写css样式都是用到什么就在样式表后添加什么,完全没有考虑到样式属性的书写顺序对网页加载代码的影响.后来逐渐才知道正确的样式顺序不仅易于查看,并且也属于css样式优化的一种方 ...
- 理解 tf.Variable、tf.get_variable以及范围命名方法tf.variable_scope、tf.name_scope
tensorflow提供了通过变量名称来创建或者获取一个变量的机制.通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递. 1. tf.Variable( ...