zoukankan      html  css  js  c++  java
  • Base64编码

    1. 为什么需要Base64编码?

    • 随着Internet的发展,电子邮件不仅仅是交换文本信息,而是用图像、音频、视频、附件等形式传递更加丰富的多媒体信息。但这些多媒体信息是非ASCII码的二进制数据,使用邮件格式标准RFC822邮件格式发送这些多媒体信息数据时,由于网络传输只能传输可打印字符,故需要采用编码解码方式将其进行“编码”成可打印的字符再进行传输,再进行解码出原始的二进制数据。针对该需要,人们定义了电子邮件技术规范MIME协议(多用途互联网邮件扩展Multipurpose Internet Mail Extensions),在改变SMTP协议和RFC822的基础上,使得邮件可以传送任意二进制文件。
    • 随着电子邮件用户增加,像中文、日文等字符不能被服务器或网关有效处理。
    • 在一个纯文本协议里,二进制信息中可能会有些部分会被当做控制字符处理,引起传输失败。
    • 很多较老的协议只支持纯文本(例如SMTP协议)。
    • 二进制不兼容,在不同的硬件上(路由器、老电脑上)显示的意义不一样,处理也不一样。

    2. Base64编码定义

    按照RFC2045的定义,Base64编码被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
    (The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)

    Base64编码是基于64个可打印字符来标识二进制数据的方法,将二进制编码成ASCII中64个可打印的字符来传输8bit字节码。编码后的64个字符在大多数机器、软件上的行为是一样的,因此可用于在HTTP环境下传递较长的标识信息。

    3. Base64编码的优势

    1)编码后的字符串只有[0-9 a-z A-Z + / =],不可打印字符(包括转移字符)也可传输;
    2)编码后只会增加字节数,字节数会成为原字节数的4/3;
    3)具有不可读性,需要解码后才能阅读;
    4)算法可逆, 解码方便, 不用于私密信息通信;
    5)算法简单, 几乎不会影响效率;
    6)方便打包,可以直接encode成字符串随着代码一起分发;
    7)和其他系统对接时,一个字符串经Base64编码解码方便。

    4. Base64编码原理 & 过程

    思想:基于64个可打印ASCII码字符对二进制数据进行重新编码。

    原理
    1)将所有二进制字符转化为64个可打印的ASCII码;
    2)将ASCII码转化为8位二进制;
    3)将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
    4)统一在6位二进制前补两个0凑足8位;
    5)将补0后的二进制转为十进制;
    6)从Base64编码表获取十进制对应的Base64编码。

    过程
    1)拆分:将待转换的字符串数据以每3个byte字节为一组,转换时,将该3个byte的数据先后放入一个24bit的缓冲区中,先来的byte占高位;
    2)重排:将拆分得到的这24位数据分为4组,即每组6位(依据:38 = 46 = 24);
    3)补 0:重排数据不足3byte时,缓冲区中剩下的bit用 0 补足;
    4)处理:每次取出6个bit,并在其前添加两个0,凑成8位。此时得到32位二进制位,即4个字节;
    5)查表:根据Base64编码表获得对应的可打印字符。(6bit(原8bit)一个字节,不足的位数用0补齐,两个0用一个 = 表示)
    6)不断进行,直到全部待转换的字符串全部转换完成。

    • 如果如果最后剩下两个输入数据,在编码结果后加1个“=”;
    • 如果最后剩下一个输入数据,编码结果后加2个“=”;
    • 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

    5. Base64编码表

    索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符
    0 A 17 R 34 i 51 z
    1 B 18 S 35 j 52 0
    2 C 19 T 36 k 53 1
    3 D 20 U 37 l 54 2
    4 E 21 V 38 m 55 3
    5 F 22 W 39 n 56 4
    6 G 23 X 40 o 57 5
    7 H 24 Y 41 p 58 6
    8 I 25 Z 42 q 59 7
    9 J 26 a 43 r 60 8
    10 K 27 b 44 s 61 9
    11 L 28 c 45 t 62 +
    12 M 29 d 46 u 63 /
    13 N 30 e 47 v
    14 O 31 f 48 w
    15 P 32 g 49 x
    16 Q 33 h 50 y

    6. 编码过程示例

    下面分别给 hello! 和 Hello!! 进行Base64编码:

    7. 解码原理

    Base64解码,即是Base64编码的逆过程。
    将Base64编码数据根据编码表分别索引到编码值,然后每4个编码值一组组成一个24位的数据流,解码为3个字符。对于末尾位“=”的base64数据,最终取得的4字节数据,需要去掉“=”再进行转换。



  • 相关阅读:
    自己写的一个读取execl的帮助类
    手动获取spring的ApplicationContext和bean对象
    前端开发不容错过的jQuery图片滑块插件(转)
    细说HTML元素的隐藏和显示
    DIV+CSS布局重新学习之使用A标签和CSS制作按钮
    opencv2函数学习之flip:实现图像翻转
    DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案
    DWZ中刷新dialog的方案解决
    DWZ与KindEditor编辑器的整合
    ViewModel在MVC3中的应用:实现多字段表格的部分更新
  • 原文地址:https://www.cnblogs.com/11sgXL/p/13558796.html
Copyright © 2011-2022 走看看