美文网首页java
【Java】Base64详解(笔记)

【Java】Base64详解(笔记)

作者: Sraindy | 来源:发表于2019-08-24 13:56 被阅读0次

    为什么会出现Base64

    来源:https://www.zhihu.com/question/36306744/answer/71626823

      在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
      对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
    Base64主要用于将不可打印的字符转换成可打印字符,或者简单的说将二进制数据编码成ASCII字符。

    Base64原理

    来源:https://blog.csdn.net/qq_36522306/article/details/80753099

      它是用64个可打印字符表示二进制所有数据方法。由于2的6次方等于64,所以可以用每6个位元为一个单元,对应某个可打印字符。我们知道三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要用4个Base64的可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中一般有所不同。但是,我们经常所说的Base64另外2个字符是:“+/”。

    image.png

    例如:
    详细案例:http://blog.xiayf.cn/2016/01/24/base64-encoding/

    image.png

    三个字节,每个字节8bit,共计24bit;而Base64是6bit为一个单元,就需要4个单元(即3个字节需要用4个可打印字符来表示

    Base64编码后长度变长:

    编码后的数据比原始数据略长,为原来的4/3 (Base64编码的长度永远是4的倍数)

    实现Base64加解密的方式主要有以下四种(推荐度由低到高):

    来源:https://blog.csdn.net/u012187452/article/details/83239117

    1:JDK中的sun.misc套件
    2:第三方扩展包 bouncy castle
    3:第三方扩展包 commons codec
    4:JDK8及更高版本中的 java.util.Base64

    Base64实现代码

    来源:
    https://blog.csdn.net/zdqdj1/article/details/51760412
    https://www.cnblogs.com/smile361/p/6362075.html

    十六进制编码和base64编码后的数据量:

    来源:https://segmentfault.com/q/1010000000801988/a-1020000002230260

      选用十六进制编码和 Base64 编码的情况比较多,主要是因为这两种编码易用,而且转换后的数据量相对较小。
      十六进制编码是将 1 个字节编码成 2 个十六进制字符,比如 0x10110110 编码成 B6,转换后数据量会增大 1 倍。即 编码后数据量 = 原先数据量 * 2。
      Base64 编码是将 3 个字节共 24 位数据,以每 6 位一个 Base64 字符 [0-9a-zA-Z+/] 表示,24 位数据共需要 4 个 Base64 字符表示,编码后数据增长约 1/3。为什么是“约”?因为如果原数据字节数不是 3 的倍数,需要补位,这样转换出来的数据量就会比原来的 4/3 略多一点。
    从上面的数据增长比来看,Base64编码 比十六进制编码更节省磁盘容量,所以一般较大的数据需要进行 ASCII 编码多采用 Base64;而较小的数据,则使用易于人工识别十六进制(用纸笔就能解码出来)。

    相关文章

      网友评论

        本文标题:【Java】Base64详解(笔记)

        本文链接:https://www.haomeiwen.com/subject/fpafectx.html