Base64、32、16 编码解析
在这里我只讲Base64编码,其次Base32和Base16原理是一样的,这里一带而过。
1.Base64:顾名思义,64就是64个可打印字符,A~Z、a~z、0~9、+、/,这64个可打印字符。2^6=64
**原则:**3*8 转换成4*6 这里的8是指电脑的二进制位8bit 即一个字符在电脑里存储情况,3指的是三个字符(任意),4指的是64个中4个可打印字符,6只得是6个二进制位。要想得到可打印字符,必须将6位补位00,形成8个二进制位,再换算十进制数,再用这个十进制数找到相应的可打印字符。后面会有例子。
2.Base32:就是32个可打印字符,2^5=32, base32中就是用5个bit位表示8bit位的字符。取其中的最小公约数,则8个base32字符表示出5个字符
原则:用5个bit 表示一个32个可打印字符中的一个,过程和Base64同理。
3.Base16:同Base32。
注意:
24位二进制很重要,这就是为什么要以三个字符为一组的原因。 所以在其他编码形式(如用到汉字时的GBK、UTF-18)从24位二进制倒推回编码前所要求的字符个数(如UTF-18里一个汉字是2-4个字节,当一个汉字为三字节时,就以这一个汉字为一组)
一. 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的四个字节。这个搞清楚了其实就差不多了。
实例:
变成6位后要想获得十进制数,必须在前面两位补00 形成8个bit二进制位,转换成相应的十进制数,来查询索引
但是转换到最后你发现不够三个字节了怎么办呢?愿望终于实现了,我们可以用两 个Base64来表示一个字符或用三个Base64表示两个字符,像下图的A对应的第二个Base64的二进制位只有两个,把后边的四个补0就是了。所以 A对应的Base64字符就是QQ。上边已经说过了,原则是Base64字符的最小单位是四个字符一组,那这才两个 字 符,后边补两个”=”吧。其实不用”=”也不耽误解码,之所以用”=”,可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。由此可见 Base64字符串只可能最后出现一个或两个”=”,中间是不可能出现”=”的。下图中字符”BC”的编码过程也是一样的。
Base32索引表:
Base16索引表:
三. 总结
说起Base64编码可能有些奇怪,因为大多数的编码都是由字符转化成二进制的过程,而从二进制转成字符的过程称为解码。而Base64的概念就恰好反了,由二进制转到字符称为编码,由字符到二进制称为解码。
Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单,只是一眼看上去不知道什么内容罢了,当然也可以对Base64的字符序列进行定制来进行加密。
Base64编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二 进制时,产生的二进制是不一样的,所以最终产生的Base64字符也不一样。例如”上网”对应utf-8格式的Base64编码是”5LiK572R”, 对应GB2312格式的Base64编码是”yc/N+A==”。
Base64也可以加密一张图片,将图片的二进制转化为base64就ok。其实所有能转换成二进制的都可以用Base编码进行加密。偷偷告诉你迅雷的BT就是用BASE64加密的哦。
Base64、32、16 编码解析相关推荐
- base64/32/16编码
base64就是一种编码格式,使用64个可见字符来表示二进制数据,可以将任意二进制数据编码成字符串.base64编码把3个8位字节转化为4个6位的字节,6位2进制能表示的最大十进制数是64,所以使用6 ...
- 音频之WAV格式编码解析
学习目标: 音频之WAV格式编码解析 学习内容: 介绍 WAV是最常见的声音文件格式之一,wav文件分为两个部分,第一个部分是wav头文件,第二个部分是PCM编码的音频数据部分.是微软公司专门为Win ...
- 格力空调红外编码解析
使用红外遥控空调,就必须先了解红外遥控的原理,数据的定义等.本博客解析了空调的最基本的功能的红外编码,包括:开关,温度,定时,风速,扫风,校验码.其他的功能因为空调型号不同而差别较大,所以暂时不作解析 ...
- HTTP1.1中CHUNKED编码解析(转载)
HTTP1.1中CHUNKED编码解析 一般HTTP通信时,会使用Content-Length头信息性来通知用户代理(通常意义上是浏览器)服务器发送的文档内容长度,该头信息定义于HTTP1.0协议RF ...
- OpenJudge NOI 1.7 32:行程长度编码
[题目链接] OpenJudge NOI 1.7 32:行程长度编码 [题目考点] 1. 字符串 [解题思路] 本题与OpenJudge NOI 1.7 31:字符串p型编码基本相同.可以参考上一题的 ...
- python 图片/语音文件实现base64的转换与解析
转化与解析流程:二进制读取---转为base64(b64encode)--- 解码(b64decode)--- 输出图片/语音文件 # 实现base64的转化与解析 with open('test.p ...
- 便利贴--41{js - base64 - _utf8_ 的编码和解码}
便利贴--41{便利贴--41{js - base64 - _utf8_ 的编码和解码}} 编码 解码 utf8 合并 编码 this.encode = function (input) {_keyS ...
- Base64与16进制转换
记录与硬件通信的Base64与16进制字符串转换 /*** 202212* <p>* base64ToHex* HexToBase64* </p>*/ public class ...
- java chunked编码解码_HTTP协议中的CHUNKED编码解析
HTTP协议中的TRANFER-ENCODING:CHUNKED编码解析 通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输.c ...
- Protobuf编码解析
protobuf的安装 tar zxvf protobuf-cpp-3.8.0.tar.gz cd protobuf-3.8.0/ ./configure CXXFLAGS="-O2&quo ...
最新文章
- CodeForces 157A Game Outcome
- java中数组的一些笔记
- FFT算法8点12位硬件实现 (verilog)
- SublimeText3系列(1)-安装、设置、快捷键、常用插件
- MySQL中表的操作
- Day04-经典卷积神经网络解读
- 针对应用开发者的几点建议
- textview文本超出部分用省略号表示
- 【JAVA基础篇】String类详解
- SpringBoot学习笔记(8):事物处理
- Delphi中使用API将目录删除函数
- 聊聊2019年的web前端
- Android studio断点调试(全在这里)
- 【转贴】gdb中的信号(signal)相关调试技巧
- 微软在线实验室启用谷歌的reCAPTCHA,我们又丢失了一个好东东
- Dagger2 知识梳理(3) 使用 dependencies 和 @SubComponent 完成依赖注入
- 奥维互动地图如何删除标签_奥维互动地图浏览器标签附件添加设置方法
- DOSBOX 安装与使用
- 人工智能的语义学基础
- 这是你不曾见过的最全的ASO应用市场优化方式(上篇)