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进行简单的处理,防止肉眼可以直视出这些信息的处理规则。同时也可以有效的进行互联网信息传输。

时间: 2024-10-23 15:19:40

Base64 的那些事儿的相关文章

XSS与字符编码的那些事儿

目录 0x00:基本介绍 0x01:html实体编码 0x02:新增的实体编码 实体编码变异以及浏览器的某些工作原理! 0x03:javascript编码 0x04:base64编码 0x05:闲扯 0x00基本介绍 提起XSS 想到的就是插入字符字符编码与各种解析了! 这也就是各种xss编码插件跟工具出世的原因!之前不懂浏览器是如何对我们编码过的代码进行解析的时候就是一顿乱插! 各种编码 各种插 没把编码还原就算了 还原了就算运气好!后来到PKAV经过二哥和短短的调教后才算是弄清楚了一点编码与

【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名

记一个 Base64 有关的 Bug

本文原计划写两部分内容,第一是记录最近遇到的与 Base64 有关的 Bug,第二是 Base64 编码的原理详解.结果写了一半发现,诶?不复杂的一个事儿怎么也要讲这么长?不利于阅读和理解啊(其实是今天有点懒想去休闲娱乐会儿),所以 Base64 编码的原理详解的部分将在下一篇带来,敬请关注. 0x01 遇到的现象 A 向 B 提供了一个接口,约定接口参数 Base64 编码后传递. 但 A 对 B 传递的参数进行 Base64 解码时报错了: Illegal base64 character

gulp教程(sass,livereload,md5,css压缩,js压缩,img的base64)

环境 node -v  v6.10.3 npm -v  3.10.10 package.json如下: { "name": "zhcsdata", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": &

PHP_EOL换行 与 base64编码

base64编码包括64个字符:10个数字(0-9),26*2个字母(a-zA-Z),+,\ 其中还有一个第65个字符=作为后缀,没有实际作用. 来一段代码说明个问题: 1 <?php 2 3 $str = '1234567'; 4 5 $en = base64_encode($str);// MTIzNDU2Nw== 6 7 $en = 'MTIzND U 8 9 2Nw=========='; 10 11 echo base64_decode($en);// 1234567 可以看到,即使修

[C语言]Base64编码解码

Base64编码解码 一,Base64编码原理 Base64编码的字符数组如下所示 : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 字符串转Base64编码:取3字节的字符串转换为四字节的字符串,依次往后转换.得到Base64编码字符串.具体原理如下: 1,如果需要编码的原串字节数刚好为3的倍数,那么转换规则如下: 以中文字符'严'为例,'严'字的UTF-8编码为:0xE4B8A5 = 11100100  10

有些事儿,工程师可能今生仅此一次

郑昀 创建于2016/9/15 最后更新于2016/9/18 关键词:深度思考,碎片化阅读,做论文,深入研究, 早先在<技术高手如何炼成>一文中提到,我会问面试者,你日常如何构建自己的知识体系.有人会觉得你怎么就问出这么宏大的问题?知识体系,这是什么鬼? 面试时的交谈 工作之后你做过这样的事情吗? 面试是一个谁主张谁举证的过程,有时候需要面试者举出实例,自我证明. 而我认为问一些我们工作中遇到的难题和业务场景是在“欺负”面试者,所以我喜欢问开放型问题: 在你工作之后,你有没有像做毕业论文一样对

【前端攻略】:玩转图片Base64编码(转)

引言 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的Base64编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的base64编码.标题略大,不过只是希望通过一些浅显的论述,让你知道什么是图片的base64编码,为什么我们要用它,我们如何使用并且方便的使用它,并让你懂得如何去在前端的实际工作中运用它. 什么是base64编码? 我不是来讲概念的,直接切入正题,图片的base64编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址. 这样做有什么意义呢?我

医疗时鲜(Running)资讯(ZSSURE):移动医疗不算事儿

背景 最近在看Dr.2的书<移动医疗那点事儿>,所以此次博文就厚颜无耻的叫做"移动医疗不算事儿".新的一年,新的积累与进步,继续关注医疗行业的最新动态.此次主要介绍吐槽一下关于"自由执业"和"电子病例"的新闻.Running-- 自由执业 在<移动医疗那点事儿>中,Dr.2开篇问了一个问题"什么样的医生会出来自由执业?刚毕业的孩子会出来自由执业么?",其观点认为:会从体制内出来的医生通常都是一些在临床业