计算机只能处理数字,所以要处理任何文本,只能先将文本转化为数字才行。

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编码解码原理的更多相关文章

  1. 【学习笔记】Base64编码解码原理及手动实现(C#)

    1.[Base64编码原理]@叶落为重生 -base64的编码都是按字符串长度,以每3个8bit的字符为一组,-然后针对每组,首先获取每个字符的ASCII编码,-然后将ASCII编码转换成8bit的二 ...

  2. C# Base64编码/解码

    一.编码规则      Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据分成4 ...

  3. Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net

    Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码, 1 1.1. 子模式 urlsafe Or  url  ...

  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 u ...

  5. 《PHP 实现 Base64 编码/解码》笔记

    前言 早在去年 11 月底就已经看过<PHP 实现 Base64 编码/解码>这篇文章了,由于当时所掌握的位运算知识过于薄弱,所以就算是看过几遍也是囫囵吞枣一般,不出几日便忘记了其滋味. ...

  6. OpenSSL 使用 base64 编码/解码

    简述 关于 OpenSSL 的介绍及安装请参见:Windows下编译OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #incl ...

  7. 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

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

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

  9. base64编码的原理及实现

    base64编码的原理及实现 我们的图片大部分都是可以转换成base64编码的data:image. 这个在将canvas保存为img的时候尤其有用.虽然除ie外,大部分现代浏览器都已经支持原生的基于 ...

随机推荐

  1. Spark性能优化【OOM】

    一.异常情况 Spark on yarn模式下,当yarn为client的模式时没有OOM而cluster模式下出现OOM 二.异常分析 由于client模型没有出现OOM而cluster模式出现OO ...

  2. IPerf——网络测试工具介绍与源码解析(5)

    本篇随笔讲述一下TCP协议下,双向测试模式和交易测试模式下客户端和服务端执行的情况: 双向测试模式: 官方文档的解释 Run Iperf in dual testing mode. This will ...

  3. CVE-2017-8464 分析

    目录 CVE-2017-8464(stuxnet 3.0) 分析 0xFF 前言 0x00 分析工具 0x01 漏洞复现 1).生成一个DLL用于测试 2).构造一个恶意的lnk二进制文件 3).RU ...

  4. php 计算出一年中每周的周一日期

    最近接到一个任务,归纳起来,就是:要算出每年当中,每周的周一日期.想了一会,看了下date函数,深入了解了一下date函数各个参数的含义之后,终于把这道题做出来了! 在date()函数中,有一个参数对 ...

  5. 《Java大学教程》—第13章 程序包

    接下来,是第二学期的内容,也是相对深入的Java学习. 自测题:1.    在类的开发过程中,程序包的作用是什么?P321程序包是为了方便定位和部署类,还可以避免将来类之间出现名称冲突. 2.    ...

  6. rem实现自适应

    总结一下,rem实现自适应:用rem代替px,配合媒体查询设置font-size:n%. 首先,px是死的.若一律用px,那就会大的显得小,小的屏幕显得大.其次,rem是活的,通过设置字体大小可以引起 ...

  7. 数以亿计运行PHP的网站即将面临严重的安全风险

    数以亿计运行PHP的网站即将面临严重的安全风险 根据W3Techs的统计数据,目前所有互联网站点中约有78.9%使用PHP运行.但是2018年12月31日,PHP 5.6.x的安全支持将正式停止,标志 ...

  8. 使用vue-cli脚手架创建项目

    ue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一.安 ...

  9. nosql:文件存储和sql数据库存储形式之外的存储系统都是nosql

    为了设计一个比较好的磁盘缓存,我调查了大量的开源库,包括 TMDiskCache.PINDiskCache.SDWebImage.FastImageCache 等,也调查了一些闭源的实现,包括 NSU ...

  10. 安利一个_Java学习笔记总结

    javaIO 字符编码 多线程 线程池 ArrayList遍历方式 LinkedList遍历方式 Vector遍历方式 Vector, ArrayList, LinkedList 的区别是什么? Ha ...