Base64到底能做什么?
网络中的语言文字,底层都是用二进制存储的,网络传播时,可以对二进制进行Base64编码后传输,解决各国语言传输时乱码问题;
URL特殊字符转义:http协议中,特殊字符会被当做转义字符处理,所以要对特殊字符转义,保证参数正确;
Html中嵌入图片,可以不需要图片路径,使用src="图片经过Base64编码后的内容"。
Base64是一种编码方式(换一种体现形式,便于传输,提高可读性),不是加密算法(把明文变为难破解的密文,加大识别难度)
Base64原理是什么?
什么是Base64编码:Base64是⽹络上最常见的⽤于传输8Bit字节码的编码⽅式之⼀,Base64就是 ⼀种基于64个可打印字符来表示⼆进制数据的⽅法 基于64个字符A-Z,a-z,0-9,+,/的编码⽅式, 是⼀种能将任意⼆进制数据⽤64种字元组合成字符串的⽅法,⽽这个⼆进制数据和字符串资料之 间是可以互相转换的。
为什么是64个字符:常用字符集编码(GB2312,GBK,UTF-8)中,一个字符一般最多三个字节表示,3*8=24bit,Base64每6个bit一组,6bit十进制范围为0~63,考虑到显示方便(64个字符就可以完全对应显示)和节省存储(Base64字符表中的字符原本用6个bit就可以表示,现在前面添加2个0,变为8个bit,会造成一定的浪费。因此,Base64编码之后的文本,要比原文大约三分之一)
手算Base64
例如:"冬至"转换为Base64编码
实现步骤:
找到中文字符在操作系统中对应的字符编码(参考代码页字符对照表,windows10为GB2312);
找到中文字符编码的十进制值,把十进制转换为二进制(参考GB2312简体中文编码表);
对二进制分组,每6bit一组(最后不足6bit补0);
“冬”:

16进制表示:B6A0,+C
十进制 :46752+12=46764
二进制:1011011010101100
"至":
二进制:1101011011000001
分组后:101101 101010 110011 010110 110000 01
手算“冬至”Base64编码结果为 tqzWwQ
Java处理Base64
package com.example.base64demo;import java.io.IOException;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public class JDK8BeforeBase64 {/*** JDK8之前Base64编解码处理* 缺点:编解码效率差* @param args* @throws IOException*/public static void main(String[] args) throws IOException {BASE64Encoder encoder = new BASE64Encoder();BASE64Decoder decoder = new BASE64Decoder();String text = "我的祖国";byte[] textByte = text.getBytes("UTF-8");//编码String encodedText = encoder.encode(textByte);System.out.println(encodedText);//解码System.out.println(new String(decoder.decodeBuffer(encodedText),"UTF-8"));}}//还有一种方式是Apache Commons Codec有提供Base64编码和解码,缺点是需要引用
package com.example.base64demo;import java.io.UnsupportedEncodingException;import java.util.Base64;public class JDK8Base64 {/*** JDK8的java.util包中,新增了Base64的类* @param args* @throws UnsupportedEncodingException*/public static void main(String[] args) throws UnsupportedEncodingException {Base64.Decoder decoder = Base64.getDecoder();Base64.Encoder encoder = Base64.getEncoder();String text = "冬至";byte[] textByte = text.getBytes("GB2312");//编码String encodedText = encoder.encodeToString(textByte);System.out.println(encodedText);//解码System.out.println(new String(decoder.decode(encodedText), "GB2312"));}}
补充说明
“=”或“==”号出现在Base64的编码结果中,“=”在此是作为填充字符出现;
不同编码对应Base64编码结果都不一样。




