一. Base64编码由来

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

  二. Base64编码原理

  看一下Base64的索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。数值代表字符的索引,这个是标准Base64协议规定的,不能更改。64个字符用6个bit位就可以全部表示,一个字节有8个bit位,剩下两个bit就浪费掉了,这样就不得不牺牲一部分空间了。这里需要弄明白的就是一个Base64字符是8个bit,但是有效部分只有右边的6个bit,左边两个永远是0。

  那么怎么用6个有效bit来表示传统字符的8个bit呢?8和6的最小公倍数是24,也就是说3个传统字节可以由4个Base64字符来表示,保证有效位数是一样的,这样就多了1/3的字节数来弥补Base64只有6个有效bit的不足。你也可以说用两个Base64字符也能表示一个传统字符,但是采用最小公倍数的方案其实是最减少浪费的。结合下边的图比较容易理解。Man是三个字符,一共24个有效bit,只好用4个Base64字符来凑齐24个有效位。红框表示的是对应的Base64,6个有效位转化成相应的索引值再对应Base64字符表,查出"Man"对应的Base64字符是"TWFU"。说到这里有个原则不知道你发现了没有,要转换成Base64的最小单位就是三个字节,对一个字符串来说每次都是三个字节三个字节的转换,对应的是Base64的四个字节。这个搞清楚了其实就差不多了。

         

  但是转换到最后你发现不够三个字节了怎么办呢?愿望终于实现了,我们可以用两个Base64来表示一个字符或用三个Base64表示两个字符,像下图的A对应的第二个Base64的二进制位只有两个,把后边的四个补0就是了。所以A对应的Base64字符就是QQ。上边已经说过了,原则是Base64字符的最小单位是四个字符一组,那这才两个字符,后边补两个"="吧。其实不用"="也不耽误解码,之所以用"=",可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。由此可见Base64字符串只可能最后出现一个或两个"=",中间是不可能出现"="的。下图中字符"BC"的编码过程也是一样的。

  三. 总结  

  说起Base64编码可能有些奇怪,因为大多数的编码都是由字符转化成二进制的过程,而从二进制转成字符的过程称为解码。而Base64的概念就恰好反了,由二进制转到字符称为编码,由字符到二进制称为解码。

  Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单,只是一眼看上去不知道什么内容罢了,当然也可以对Base64的字符序列进行定制来进行加密。

  Base64编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二进制时,产生的二进制是不一样的,所以最终产生的Base64字符也不一样。例如"上网"对应utf-8格式的Base64编码是"5LiK572R",对应GB2312格式的Base64编码是"yc/N+A=="。

引用 http://www.cnblogs.com/luguo3000/p/3940197.html

转载于:https://www.cnblogs.com/lhking/p/6947183.html

Base64编码理解相关推荐

  1. 简述 · 如何理解base64编码

    base64,就是将字节序列编写为可打印的ascii字符,关键就集中在"可打印"三个字上. 计算机中数据存储使用二进制来表示,为了便于阅读,就需要指明哪些二进制数据代表哪个符号,于 ...

  2. [编解码] 关于base64编码的原理及实现

    转载自: http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html [Base64] -base64的编码都是按字符串长度,以每3个8 ...

  3. 奇妙的Base64编码

    各位看官应该都是资深的网虫了,小弟斗胆在此问问大家,平时上网时,除了泡MM.到论坛灌水.扔版砖--之外,进行的最多的是什么活动?对了,你一定会说:是收发电子邮件!(谁敢说自己没收/发过电子邮件的?拉出 ...

  4. base64编码 springboot_Spring Boot 中如何实现 HTTP 认证?

    松哥给最近连载的 Spring Security 系列也录制了视频教程,感兴趣的小伙伴请戳这里->Spring Boot+Vue+微人事视频教程(Spring Boot 第十章就是 Spring ...

  5. 浅谈Base64编码算法

    一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码. 解码:利用编码使用的算法的逆运算,对经过编码的 ...

  6. Base64编码算法

    转载:http://www.cnblogs.com/xqxacm/p/4886299.html 一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式 ...

  7. 关于base64编码的原理及实现

    我们的图片大部分都是可以转换成base64编码的data:image. 这个在将canvas保存为img的时候尤其有用.虽然除ie外,大部分现代浏览器都已经支持原生的基于base64的encode和d ...

  8. JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库

    转载自  JAVA解析html文档,替换img图片路径成base64编码,并将文章存入数据库 开发环境:struts2+ spring + hibernate 数据库:oracle 需求:在HTML编 ...

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

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

最新文章

  1. Mybatis-Plus 之 人生中荒废的一下午
  2. C++ classics
  3. 【注意】关于Redis存在远程命令执行漏洞的安全公告
  4. c语言 二进制输出_程序员入门C语言,需要掌握的4个基础知识
  5. 使用NSURLCache 数据缓存
  6. 一种网络进程间通信的方式—— 管道
  7. java.lang.NoClassDefFoundError: com/android/build/gradle/internal/ToolingRegistryProvider
  8. 【iOS开发】带有 Extension Target 的 App,如何签名打包
  9. 【转】B树的插入和删除
  10. forever不重启 node_利用forever确保nodejs在后台运行,不会down掉
  11. html5中标签与类的区别,html5中section标签与div标签的区别是什么
  12. 【密码学原理】密钥管理和分发——对称密钥分发
  13. 开启Windows卓越性能模式
  14. prometheus安装使用
  15. 日本剑道规则及道场礼节 ——值得学习
  16. Zeal 面向开发者的离线文档查看工具
  17. 改了dns服务器有没有影响,dns改成114有危险吗_dns改了有什么影响
  18. Eclipse中 maven项目报错:Project 'xxx' is missing required Java project: 'xxx'
  19. 移动硬盘提示需要格式化怎么办?数据可以恢复吗
  20. 流利阅读12.21 Surveying China’s livestreaming economy

热门文章

  1. MAC OS升级记录
  2. WPF 逻辑树和可视化树
  3. 知乎网页(用php从数据库读取数据)
  4. 微信二维码扫一扫打开手机外部浏览器打开指定HTML网页
  5. CSDN云IDE怎样克隆代码
  6. paly()方法和pause()方法
  7. 为skynet的crypt库扩展一些加密(摘要)算法支持
  8. K8s系列之:DNS服务搭建指南
  9. spring上传文件
  10. OpenCV之VideoCapture的使用——打开网络摄像头/图像序列