-前言-

上前几篇博客做图集分解的时候Image对象生成的时候,不是使用的直接用二进制数据生成的图像数据,而是使用的转化后的base64数据来生成的。本片博客就让我们来了解下Base64及写一个编解码器。

-正文-

base64编码格式是一种可以由文本编辑器打开查看的编码格式,与二进制不同,base64之所有称为64,也是因为我们要映射的二进制数据是在一个64长度的字符集中映射出来的。base64最终生成的其实就是一长串字符串。因此Base64是一种用64个字符来表示任意二进制数据的方法。

下面是base64的字符集:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

字节、位

位是计算机存储单元最小单位,一个位表示一个0或者一个1,一字节有8位。

二进制与Base64的转换关系

如上图所示,当数据刚好3个字节的时候使用4个字符去表示这3个字节,它们的比例为3:4,这就意味着基于base64编码的文本数据要比基于二进制表示的数据要多33%,原本3个字节可以表示的数据我们用base64去表示就会需要4个字节去表示。

因此base64的优点就是它的可读性,易用性。缺点就是比原始二进制数据使用了更多空间去表示数据。

上面说的比例3:4可以使用4个字节去生成base64字符串,当原始二进制数据不是3的倍数时也同样可以表示。

当原始数据不是字节数不是3的倍数时

原始数据不可能刚刚好3的倍数,假设现在我们的原始数据是2个字节,也就是16位,换算成base64要囊括这16位数据需要3 * 6 =18位数据来表示,就多余了2位,多出的数据我们就可以使用”=“来表示,也就是上面字符集中的最后一个符号。当多出2位的时候就使用两个”=“来补足。

二进制数据与base64的转换

我们以字符”A“的转换举例来看看是如何转换的。

首先A的Unicode码为65,二进制表示为0100 0001,然后将其右移2位,相对于取8位中的6位,与上面所说一致。得到16,二进制表示为0001 0000。之后我们补足了一个字节的6位还需要2位,后面的两位需要由下一个字符贡献4位,当前字符贡献2位。虽然我们输入的A只有一个字符,但还是需要这样算。我们去A的末尾有效为两位即与3(二进制11)与运算然后左移4位,之后用后面一个字符的右移4位组成一个新的字符,算出两个值均为16,查表得16,因为A用base64空了4位,需要用两个==补足,因此A用base64表示得到了QQ==。

代码实现

/*** 个人工具集合*/
window.Tool = (function(exports){'use strict';/*** base64处理工具*/class Base64{/*** 构造函数*/constructor(){}/*** 编码Base64* @param {string} input */static encode64(input){input = escape(input);//转义字符var output = "";var c1,c2,c3 = "";var e1,e2,e3,e4 = "";var i = 0;do{c1 = input.charCodeAt(i++);//返回指定字符位置的Unicode编码c2 = input.charCodeAt(i++);c3 = input.charCodeAt(i++);e1 = c1 >> 2;//右移2位 e2 = ((c1 & 3) << 4) | (c2 >> 4);//3二进制:11e3 = c3 & 63;//63二进制:111111if(isNaN(c2)){e3 = e4 = 64;//=}else if(isNaN(c3)){e4 = 64;//=}output = output + Base64.keyChar.charAt(e1) + Base64.keyChar.charAt(e2) + Base64.keyChar.charAt(e3) + Base64.keyChar.charAt(e4);c1 = c2 = c3 = "";e1 = e2 = e3 = e4 = "";                                }while(i < input.length);return output;}/*** 解码Base64* @param {string} input */static decode64(input){var output = "";var c1,c2,c3 = "";var e1,e2,e3,e4 = "";var i = 0;var base64test = /[^A-Za-z0-9\+\/\=]/g;if(base64test.exec(input)){alert("ERROR INPUT:base64字符只能包含A-Z,a-z,0-9,'+','/','='");return;}input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");do{e1 = Base64.keyChar.indexOf(input.charAt(i++));e2 = Base64.keyChar.indexOf(input.charAt(i++));e3 = Base64.keyChar.indexOf(input.charAt(i++));e4 = Base64.keyChar.indexOf(input.charAt(i++));c1 = (e1 << 2) | (e2 >> 4);//c2 = ((e2 & 15) << 4) | (e3 >> 2);//15二进制:1111c3 = ((e3 & 3) << 6) | e4;//3二进制:11output = output + String.fromCharCode(c1);if(e3 != 64){output = output + String.fromCharCode(c2);}if(e4 != 64){output = output + String.fromCharCode(c3);}c1 = c2 = c3 = "";e1 = e2 = e3 = e4 = "";}while(i < input.length);return unescape(output);}}Base64.keyChar = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=`;exports.Base64 = Base64;return exports;
}({}))

理解Base64编码及实现编解码Base64相关推荐

  1. golang中base64 md5 sha256的编解码及摘要算法、aes、des、sha1

    golang中base64 md5 sha256的编解码及摘要算法.aes.rsa.des.sha1 golang中base64 md5 sha256的编解码及摘要算法 关于加密解密 AES DES ...

  2. golang中base64编码_golang中自带base64编码和解码

    golang中base64的编码和解码可以用内置库encoding/base64 package main import ( "encoding/base64" "fmt ...

  3. 前端上传图片回显并用base64编码,后端做解码储存,存储图片路径在.properties文件中配置(以上传身份证照片为例)

    前端页面: <form id="kycForm" enctype="multipart/form-data"> <input type=&qu ...

  4. golang中base64编码_Go语言教程:Base64编码

    概念简介 Go语言提供内建的 base64 编解码支持. 例程代码 package main // 这个语法引入了 `encoding/base64` 包并使用名称 `b64` // 代替默认的 `b ...

  5. (转)base64编码(严格说来,base64不算作加解密算法)

    [README] 1.本文转自: Java base64加密解密 - xuwc - 博客园参考: https://www.cnblogs.com/luguo3000/p/3940197.html ht ...

  6. php判断base64编码,检测PHP中的base64编码?

    要检测PHP中的base64编码,代码如下- 示例<?php $value_1 = array(); foreach (str_split('az019AZ~~~!@#$%^*()_+|}?&g ...

  7. java中base64编码加密和android中base64编码加密不一样?base64编码解析错误?

    在android的base64加密后得到: WwogIHsKICAgICJ0MSI6ICIwIiwKICAgICJ0MiI6ICIyNDM4NCIsCiAgICAidDMiOiAiIiwKICAgIC ...

  8. 编解码base64、对称加密aes和非对称加密rsa

    base64 :(兼容所有bit8位的字符,然后用64种字符进行转码,达到一致性) 意思就是:考虑到多语言原因,有的特殊字符传输不兼容,因为很多都是只支持ASSIC码,那么特殊字符就会找不到对应的AS ...

  9. java编解码base64

    在alibaba的fastjson中base64上增加的一些方法 package littlehow.base64;import java.nio.charset.Charset; import ja ...

  10. base64编码转换android,Android将base64编码转化成图片

    类似base64流的图片解析并展示: data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBw ...

最新文章

  1. 图灵奖得主Judea Pearl 智源大会演讲:从“大数据革命”到“因果革命”
  2. activity的使用(八):生命周期
  3. tomcat的部署及session绑定反代
  4. 三、oracle 用户管理一
  5. CodeForces - 1486D Max Median(二分+最长连续子段和)
  6. 应届生求职产品经理系列【三】:0岁产品经理的八大困惑(上)
  7. linux的/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow
  8. 以为来自东华理工大学学生的SCI投稿经验
  9. Mac下载工具哪个好?迅雷 for Mac是个不错的选择!
  10. POI(兴趣点)抓取工具
  11. 七年级画图计算机教案,信息技术画图软件学习教案
  12. 计算机图形学的网络课程
  13. java怎么做界面设计_11-Java 界面设计
  14. 微服务容器化运维:微博容器运维平台DCP
  15. 离散数学计算机专业论文,计算机与离散数学论文.doc
  16. Win7减肥攻略及小技巧
  17. airflow系列教程(二)Apache airflow完整安装流程
  18. 手机在线录音转文字的方法?一个工具,详细步骤教你完成
  19. 杯子抱枕手机壳 日历书签文化衫 这里的文创样机应有尽有!
  20. 算法 {特殊算法知识汇总}

热门文章

  1. 一文了解AAAI国际会议–附: 各年论文连接
  2. 二维码的原理竟如此简单,第一次有人说的这么明白
  3. chisel 仲裁器Arbiter和队列Queue(ready-valid接口)
  4. 视频教程-java淘宝优惠券系统二-Java
  5. linux中硬链接为什么不能跨分区
  6. 偶的流氓老公zt (超搞笑-转)
  7. flv转换mp4最简单方法
  8. android知乎多图片选择,知乎开源Matisse图片选择器使用
  9. 推荐系统用户反馈延迟新解法!阿里提出CVR无偏估计算法
  10. Frodo and pillows CodeForces - 760B (二分)