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

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. 有效运维的 on-call 机制

    [编者按]本文作者为云告警平台OneAlert负责人,著<云计算与OpenStack>,在IT运营管理.云计算方面从业10多年. 正文 互联网技术的发展,离不开运维支撑工作,没有零bug的 ...

  2. Scala实现树形结构

    package graphx import java.util.ArrayList import java.util.List /** * Created by zhen on 2018/12/28. ...

  3. celery任务进程关闭

    方法1: ps auxww|grep 方法2: Ctrl+C 方法3: celery multi 管理 celery multi start w1 -A proj -l info celery mul ...

  4. WinServerDFS

    DFS提供共享路径统一命名,且文件相互备份,具有高可用性. 1.在相应的服务器上安装服务. --命名空间,复制以及管理控制台的安装 install-windowsfeature fs-dfs-name ...

  5. 磁盘测试工具FIO工具安装和使用方法

    一.FIO工具安装: 1.查看fio是否安装 [root@localhost /]#rpm –qa|grep fio 2.源码安装(推荐) 官网地址:http://freecode.com/proje ...

  6. [Hive_add_10] Hive 的 serde (序列化 & 反序列化) 操作

    0. 说明 serde 是序列化和反序列化 serialize & deserialize 是将文件中的字段映射成 Hive 中的列 1. 验证 1.1 openCSVSerde CSV 为逗 ...

  7. Jetbrains IntelliJ IDEA PyCharm 注册激活(2018最新)

    AppCode CLion DataGrip GoLand IntelliJ IDEA PhpStorm PyCharm Rider RubyMine WebStorm下载注册激活 官方下载地址 Ap ...

  8. Call to a member function display() on a non-object问题的解决

    在使用ThinkPHP做项目的时候,出现了如下 的报错: 报错是Call to a member function display() on a non-object.我的代码是: 查看了ThinkP ...

  9. JavaScript数据类型之数字类型

    引言 JavaScript不区分整数值和浮点数值,全部使用浮点数值表示.当一个数字直接出现在JavaScript程序中,我们称之为数字直接量(numeric litertal).JavaScript支 ...

  10. googLeNet网络

    1.什么是inception结构 2.什么是Hebbian原理 3.什么是多尺度处理 最近深度学习的发展,大多来源于新的想法,算法以及网络结构的改善,而不是依赖于硬件,新的数据集,更深的网络,并且深度 ...