一、Base64编码由来

为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法

二、Base64编码表

看一下Base64的索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。数值代表字符的索引,这个是标准Base64协议规定的,不能更改。

三、Base64编码原理

  Base64的码表只有64个字符, 如果要表达64个字符的话,使用6的bit即可完全表示(2的6次方为64)。

  因为Base64的编码只有6个bit即可表示,而正常的字符是使用8个bit表示, 8和6的最小公倍数是24,所以4个Base64字符可以表示3个标准的ascll字符;

  如果是字符串转换为Base64码, 会先把对应的字符串转换为ascll码表对应的数字, 然后再把数字转换为2进制, 比如a的ascll码味97, 97的二进制是:01100001, 把8个二进制提取成6个,剩下的2个二进制和后面的二进制继续拼接, 最后再把6个二进制码转换为Base64对于的编码, 以下为具体的解析过程案例:

  把abc这三个字符转换为Base64的过程

运行下面代码

字符串      a       b        c
ASCII 97 98 99
8bit 01100001 01100010 01100011
6bit 011000 010110 001001 100011
十进制 24 22 9 35
对应编码 Y W J j

  把man这三个字符转换为Base64的过程

运行下面代码

字符串    m         a        n
ASCII 109 97 110
8bit 01101101 01100001 01101110
6bit 011011 010110 000101 101110
十进制 27 22 5 46
对应编码 b W F u

  现在还有一点小问题,当转换到最后, 最后的字符不足3个字符咋办, 如果不足三个字符的话,我们直接在最后添加=号即可, 具体可以参考以下两个字符串转换案例:

  目前Data URI 支持很多中类型:

运行下面代码

  目前,Data URI scheme支持的类型有:
  data:,文本数据
  data:text/plain,文本数据
  data:text/html,HTML代码
  data:text/html;base64,base64编码的HTML代码
  data:text/css,CSS代码
  data:text/css;base64,base64编码的CSS代码
  data:text/javascript,Javascript代码
  data:text/javascript;base64,base64编码的Javascript代码
  data:image/gif;base64,base64编码的gif图片数据
  data:image/png;base64,base64编码的png图片数据
  data:image/jpeg;base64,base64编码的jpeg图片数据
  data:image/x-icon;base64,base64编码的icon图片数据

  base64简单地说,它把一些 8-bit 数据翻译成标准 ASCII 字符,目前,IE8、Firfox、Chrome、Opera浏览器都支持这种小文件嵌入。

四、参考资料

Base64原理解析

最新文章

  1. ruby中tes-unitt数据初始化方法整理
  2. arcgis_engine_develop_error_42
  3. HTML5基本标签、样式
  4. Sql server脏读、更新丢失、不可重复读、幻象读问题及解决方案
  5. POJ 1364 King --差分约束第一题
  6. chche缓存
  7. 加快AndroidStudio运行速度的方法
  8. 【笔记】Loadrunner添加OS类型为Windows的服务器(Win7)
  9. R语言-时间序列
  10. Vivado安装、生成bit文件及烧录FPGA的简要流程
  11. Django-路由层
  12. nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
  13. LineRenderer组建实现激光效果
  14. leecode第四十三题(字符串相乘)
  15. RTB业务知识之1-原生广告
  16. idea导入eclipse中的maven项目
  17. 记录下(同一个计算机)多个容器 dockr bridge(桥接) docker-compose 配置
  18. 利用开源架构ELK构建分布式日志系统
  19. Go RabbitMQ (一)
  20. Java基础—集合

热门文章

  1. Centos6下安装Hadoop2.6 问题总结
  2. x01.Weiqi.8: 一点改进
  3. WIN 下的超动态菜单(三)代码
  4. 四极耳机接线标准,N版耳机改造为i版耳机
  5. 关于Web报表FineReport打印的开发应用案例
  6. px,em,rem
  7. 不要让catalogs搞死你的eclipse
  8. POJ1273Drainage Ditches[最大流]
  9. NOIP模拟赛20161023
  10. 关于包含pom.xml的开源项目如何导入