Base64 的那些事儿
一、Base64是什么?
Base64是一种编码的格式。是将信息流(字节流)按照一定的规范,重新组合,显示出完全不相关内容的编码格式。
ps.定义是我自己总结的,我觉得对于知识的定义,只要简洁,不错误,表述清楚,不要拘泥于一个字一个词,重要的是真正理解它的原理即可。(其实是因为自己根本不知道标准的定义是什么...)
二、Base64的由来?
对计算机信息存储稍有了解的人,都清楚,在计算机内部是以二进制来存储一切信息的。而直接以二进制为单元进行处理,显然是不方便处理的,如果数量级过大,我们往往采用增加计数单位的形式。(有兴趣的同学可以参考《从1到无穷大》这本书),所以在计算机世(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )界中就出现了字节这个东西。以每8个bit位组成一个字节。这样任何信息都可以划分为占用多少多少个字节来说。如下表所示:
根据大家的认知,大小写一共52个字母、外加数字加特殊符号等,一个字节是完全可以表述完整的单个字符的(这里使用的就是ASCII对照表)。
但是对于非英语国家来说就比较头疼了。发送信息之前翻译成英语,收到之后再翻译为本国语言,显然是成本非常高的。怎么解决呢?就是使用多个字节来表示一个字符。这样UTF-8、GBK、UNICODE等编码就应运而生了(有兴趣的同学可以查下它们的区别)。这些编码基本解决了世界上已知语言在计算中有效存储流动的问题。
但是问题又来了,有时候我们使用的设备,根本就不支持这些复杂的国际化编码。
举个例子,我在家给领导发了封邮件,说最近身体不适,打算请天假去看看外面的世界。
我的表情是这样的:
领导打开邮件之后,发现是一屏幕的乱码,而且发现我今天没来。
领导的表情是这样的:
当我心情愉悦的假后来上班时,领导面带微笑的问我这两天去哪里时。
我的表情是这样的:
当领导和我说:电话打不通,邮件是乱码,人也失踪的时候。
我的表情是这样的:
当我解释事情是这样的:巴拉巴拉。
我的表情是这样的:“这件事情是这样的,说起来你可能不信 但真的是垃圾桶先动的手”
在听了我的解释以后。
领导的表情是这样的:
好了言归正传,为什么会出现上游(我)发送的消息,到了下游(领导)就出现无法理解的情况呢?
这是由于历史原因,早前Email只被允许传送ASCII字符(不知道现在是否改善),即一个字节的低7位,也就是128种表示。于是当我用各种国际字符发送消息时,势必就会出现字节的最高位居然是1的问题(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )。考虑到健壮性和容错性,有些网络设备就会把首bit位置换成0。而原本整套的非ASCII码的字符,就被硬生生的转成一套ASCII码。于是当收件者打开邮件进行阅读时,邮件系统将收到数据硬生生的再转成非ASCC码时,一切都晚了。(记得早前,大学老师去欧洲德国留学,给老师写email只能用拼音)。
其实除去网关,其他路由等硬件设备都会出现这样那样的不支持问题。(对于128~255这些不可见字符,不同路由设备在接收后的处理是不一样的,这也就是为什么发送信息经常使用转码,而不是采用直接传输单个字节这一套方法(此处可看http://www.zhihu.com/question/36306744/answer/71626823 郭无心的叙述)。而除去邮件系统,其他很多系统也会因为不支持某些特殊字符,造成发送方和接收方,双方的信息的不一致。
这里简单举个例子,我们通过互联网聊天时,数据都是先发送给服务端。服务端发现信息中包含了某个特殊字符,而服务端本身又不支持这个特殊字符。于是就从字库里,找到默认字符补填。这样接收方收到消息时,这个特殊字符就显示不出来了。取而代之的是一些缺省字符,如‘◇’,‘□’。(ps,印象中QQ游戏是不支持‘.’这个特殊字符的)。
为了解决此类的种种问题,于是Base64就应运而生了。
三、Base64是如何处理字符串编码的?
这里先直入正题,阐述关于Base64编码的情况。
首先明确这样一个前提,所有信息肯定都是以字节的形式存在的。那么他的长度对于3这个数字有三种分类:
(1)长度除以3余0:len%3=0;
(2)长度除以3余1:len%3=1;
(3)长度除以3余2:len%3=2;
第(1)情况:
我们把每3个字(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )节划分成一份,然后再把它平均拆分成4份。那么每份就有6个bit位。
3*8bit=24bit=4*6bit
然后每一个单元前边再加个00,这样就使得每个单元等等于8位,即一个比特位。
如表,我们可以发现,每个字节真正有效的特征bit位只有6位。2^6=8*8=64。也就是每个字节都可以表现出64种特征。这也正是base64的由来。
第(2)情况:
我们把每3个字节划分成一份,然后再把它平均拆分成4份。最后剩余1个字节,则拆分成6+2的形式,8bit=6+2bit,如下表:
这里会涉及到下边两种场景
1)对于不足6bit位的单元:这个直接在结尾补0,直到6位。这里最后剩余2个bit位。
2)对于完全没有分配的单元,则直接使用“=”放置在单元中。这里最后补充2个=。
与场景(1)类似,单元格数字前边补‘0’
第(3)情况
我们把每3个字节划分成一份,然后再把它平均拆分成4份。最后剩余2个字节,则拆分成6+6+4的形式,16bit=6*2+2bit,如下表:
这里与场景(2)类似会涉及到下边两种场景
1)对于不足6bit位的单元:这个直(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )接在结尾补0,直到6位。这里最后剩余4个bit位。
2)对于完全没有分配的单元,则直接使用“=”放置在单元中。这里最后补充1个=。
这样,无论信息的长度是多少,都能以这样的规则(base64编码规范),重新划分成新的字节(符)流。
同时还有一份base64的编码转换表:
如下表:
这样,无论任意的字节流,我们都可以用表中的字符+‘=’来表示了。这就是所谓的Base64编码过程了。通过Base64编码,我们可以很好的解决前文中遗留下的问题。
而对于Base64解码的过程,原理与上述一致,只是一个逆过程,这里不再赘述。
四、Base64编码技术的应用
(1) 传输数据,尽量做到数据可(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )以在网络中正常传输,同时不会因为硬件或者软件不兼容,导致数据失真。
(2) 对数据进行简单加密,如对于URL或者地址空间的处理(如百度云地址、p2p链接),可以通过简单的Base64进行简单的处理,防止肉眼可以直视出这些信息的处理规则。同时也可以有效的进行互联网信息传输。
Base64 的那些事儿的更多相关文章
- Base64编码原来是这么回事儿
鸣谢CSDN文章:https://blog.csdn.net/believesoul/article/details/84100616 一.言简意赅理解Base64编码 就是将以"字节&qu ...
- C# base64获取图片后缀
由于业务需要,使用的微服务,然后做的上传文件操作. 但是有个问题就是,如果上传的是图片,之前为了图省事儿,直接写后缀jpg,但是人总是要进步的嘛,然后抽空就找了个. 首先微服务相关就不介绍了,直接从引 ...
- 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿
[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...
- 记一个 Base64 有关的 Bug
本文原计划写两部分内容,第一是记录最近遇到的与 Base64 有关的 Bug,第二是 Base64 编码的原理详解.结果写了一半发现,诶?不复杂的一个事儿怎么也要讲这么长?不利于阅读和理解啊(其实是今 ...
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...
- Base64编码
Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...
- Android数据加密之Base64编码算法
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
- java单向加密算法小结(1)--Base64算法
从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间 ...
随机推荐
- 【DP】HDU 1114
HDU 1144 Piggy-Bank 题意:有这么个存钱罐,给你空的时候重量和满的时候的重量,再给你N中类型的硬币(给出N种硬币总数量和总重量,可多次使用),问你怎样恰好填满存钱罐,而让填入的硬币数 ...
- CSS3 动画
通过 CSS3,我们能够创建动画,这可以在许多网页中取代动画图片.Flash 动画以及 JavaScript. CSS3 动画 CSS3 @keyframes 规则 如需在 CSS3 中创建动画, ...
- discuz sphinx全文检索搜索引擎方案
基于discuz的索引配置文件,这个配置文件比较灵活,可以根据不同的需求来配置 # # linuxTone full index search configure file # source lt_p ...
- MVC入口程序 | 简单调用及实例化
入口程序: 现在大多采用单一入口机制,单一入口就是指在一个web应用程序中,所有的请求都指向一个脚本文件.通俗点说就是一幢大楼只有一个大门入口可以进去... 目录: 建立一个控制器/模型/视图调用函数 ...
- webform 简单控件
html中12个表单元素添加runat="server"后称为控件 Lable 编译之后是 <span></span> 属性:CssClass 编译成 c ...
- MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能)
我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下来我就将做一个模仿淘宝已买到的宝贝功能,不过我的是无刷新分页的. ...
- gojs绘流程图
引用:http://www.tuicool.com/articles/eEruaqu http://www.open-open.com/lib/view/open1435023502544.html ...
- C语言
HTML的学习早已落下帷幕,我们已经进入了C语言的学习,这段时间时间主要学了运算符.表达式.循环语句以及数组和字符串,感觉到了一种朦朦胧胧懂得尴尬. 运算符主要包括:算术运算符.赋值运算符.关系运算符 ...
- ExtJS笔记 Field
Fields are used to define what a Model is. They aren't instantiated directly - instead, when we crea ...
- Gerrit与Gitlab同步配置replication&其他配置
一.Gerrit与Gitlab同步配置 当配置好gerrit环境后,还需要与现有gitlab库进行同步配置,否则会影响现有开发与打包流程. 1.安装gerrit replication插件 unzip ...