• base64 编码的本质:将 8bit 二进制数转化为 6bit 的可打印字符。
    Base64编码用于需要将二进制数据转为文本数据进行储存和传输的场景。

  • Javascript内部的字符串,都以utf-16的形式进行保存,因此编码的时候,我们首先必须将utf-8的值转成utf-16再编码;
    解码的时候,则是解码后还需要将utf-16的值转回成utf-8。

  • 问:为什么在进行http传输的时候,需要将Byte数组进行base64编码呢?
    答:因为http协议是文本协议,不同于二进制协议(如Thrift)那样直接进行二进制传输。

  • base64是一种编码算法。为什么叫base64呢?因为这种算法只支持可打印字符中的64个(26个大写字母、26个小写字母、0-9这9个数字、+、/)(再加上作为垫字的"=",实际上是65个字符)。

  • 问:什么是可打印字符?
    答:ASCII码的范围是0-127,其中0-31和127这33个字符属于控制字符(Control characters)。
    剩下32-126这95个字符属于可打印字符(Printable characters),包括数字、大小写字母、常用符号。

  • 早期的一些传输协议,例如传输邮件的SMTP协议,只能传输可打印的ascii字符。导致原本8bit字节码范围(范围0-255)超过了可用的范围。
    比如当邮件传输图片资源的时候,某一个Byte值是10111011B,对应十进制187不属于ASCII码范围,因此无法被传输。
    这个时候,base64编码应运而生了,它利用6bit字符表达了原本的8bit字符。

  • 问:原本的字节码是8bit,base64怎么能够用 6bit 来容纳 8bit 的内容呢?
    答:既然单一字符的位数有限,我们可以增加字符的数量。8和6的最小公倍数是24,这就意味着我们可以用4个base64字符来表示3个传统的8bit字符。
    相比8bit的字符编码,base64编码会多占用三分之一的字节长度,以此为代价实现了更好的兼容性。

参考:http://mp.weixin.qq.com/s/1xd_sZRzsN9eMeG-tgoX1w

什么是Base64算法?什么情况下用Base64算法?的更多相关文章

  1. 冒泡法的算法最佳情况下的时间复杂度为什么是O(n)

    我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第2版>的2.2节,使用对插入排序最佳时间复 ...

  2. 数据结构与算法【Java】05---排序算法总结

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  3. CKEditor图片上传问题(默认安装情况下编辑器无法处理图片),通过Base64编码字符串解决

    准备做一个文章内容网站,网页编辑器采用CKEditor,第一次用,默认安装情况下,图片无法插入,提示没有定义上传适配器(adapter),错误码提示如下: 根据提示,在官网看到有两种途径:一使用CKE ...

  4. Snowflake(雪花算法),什么情况下会冲突?

    文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUI ...

  5. MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

    本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...

  6. [算法]体积不小于V的情况下的最小价值(0-1背包)

    题目 0-1背包问题,问要求体积不小于V的情况下的最小价值是多少. 相关 转移方程很容易想,初始化的处理还不够熟练,可能还可以更简明. 使用一维dp数组. 代码 import java.util.Sc ...

  7. 如果让你来做HashMap扩容,如何实现在不影响读写的情况下扩容?

    我觉得逼格高,不是体现在问题多刁钻,知识点多深,而是一个非常明确,无歧义的问题,能考察出面试者多方面的能力.这个问题背后:1.了解java中,HashMap的实现:如果一个面试者了解这一点,说明至少他 ...

  8. Java之HashMap在多线程情况下导致死循环的问题

    PS:不得不说Java编程思想这本书是真心强大.. 学习内容: 1.HashMap<K,V>在多线程的情况下出现的死循环现象   当初学Java的时候只是知道HashMap<K,V& ...

  9. iOS下使用SHA1WithRSA算法加签源码

    首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数 ...

随机推荐

  1. C++ vector 实现二维数组

    在STL中Vector这一容器,无论是在封装程度还是内存管理等方面都由于传统C++中的数组.本文主要是关于使用Vector初始化.遍历方面的内容.其他二维的思想也是类似的. 这里简单叙述一下C++ 构 ...

  2. 深入理解angularjs $watch ,$apply 和 $digest --- 理解数据绑定过程

    转自:http://www.angularjs.cn/A0a6 Angular用户都想知道数据绑定是怎么实现的.你可能会看到各种各样的词汇:$watch,$apply,$digest,dirty-ch ...

  3. vue-cli的安装及使用

    一.    node 和npm 1.在安装vue-cli前,要确认自己的电脑是否安装了node和npm 2.查询版本如下(vue脚手架支持node@4.xx以上) node -v    查询node版 ...

  4. learning scala read from console

    控制台输入语句: readInt, readDouble, readByte, readShort, readLong, readChar, readBoolean, readLine example ...

  5. bacula备份终端操作bconsole指令

    1.list命令列出各种备份状态信息   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 list Jobs     #列出所有备份记录状态 list jobid= ...

  6. json数组和json字符串转换成map解析

    package demo; import java.util.List;import java.util.Map;import java.util.Map.Entry; import net.sf.j ...

  7. SDWebImage导入问题

    最新的SDWebImage由于是基于ARC模式写的,如果创建的是非ARC醒目的童鞋们注意,导入文件夹之后,先添加ImageIO.framework,mapKit.framework这两个库,在非ARC ...

  8. Python 其他操作

    lst = ["太白","太白","太黑","日天","女神","alex",& ...

  9. iview Model对话框点击确定后iview会自动关闭窗口

    问题描述:在某个页面需打开一个Model,然后这个Model里有一个Form表单,点击确定时我需要先校验表单数据是否输入正确,不确定则不希望关闭窗口:(问题是:只要点击确认 loading :fals ...

  10. pip source

    linux版本 sudo vim .pip/pip.conf[global]index-url = http://pypi.douban.com/simple[install]trusted-host ...