BASE64编码
什么是Base64编码?
它是一种把二进制的数据用文本表示的编码算法.
String base64Encoder(byte[] data)
byte[]{0xe4,0xb8,0xad} -> "5Lit"
0xe4,0xb8,0xad通过base64编码,表示出来的字符串,就是"5Lit"
我们看一下如何使用Base进行编码,假如我们把中用UTF8表示的字节表示出来,他正好是三个字节,0xe4,0xb8,0xad,
utf8bytes("中") = {0xe4,0xb8,0xad};我们紧接着把这是三个字节一共是24位,按照每6位分组,分成4个字节,
这4个字节对应的16进制,正好是39,0b,22,2d,然后我们通过查表,就可以查到39对应的是5,0b对应的字母是大写L,
22对应的字母是i,2d对应的字母是t,所以最终编码出来的字符串,是5Lit
Base64编码表是从索引0一直到索引63,0对应的编码是A,1对应的编码是B,依次类推
那么使用Base64编码的目的是什么呢?
1. 它是一种使用文本表示二进制内容的方式
2. 它适用于文本协议
3. 但是他的效率会下降
例如电子邮件协议,他就是一个文本协议,如果我们要在电子邮件中添加一个二进制的文件,我们就可以用base64编码,
然后以文本的形式传送,他的缺点是传输的效率会降低,因为二进制经过base64编码,长度会增加三分之一,如果长度
不是3的整数倍,那么我们就需要在末尾补充一个0x00字节,或者是两个0x00字节,编码后我们加上一个等号就补充了
一个字节,加上两个等号就是补充了两个字节,这样写法的时候我们就可以去掉
package com.learn.securl;
import java.util.Base64;
/**
* 我们看一下如何使用Base64编码
* @author Leon.Sun
*
*/
public class SecBase64Demo {
public static void main(String[] args) throws Exception {
String original = "Hello\u00ff编码测试";
/**
* 首先我们通过getBytes把一个字符串转换为一个字节数组
* 然后我们通过Base64.getEncoder.encodeToString把一个字节数组表示为一个字符串表示的Base64
*
* 在JAVA中使用Base64编码的时候,
* 我们还可以使用withoutPadding,
* 这样我们就可以把末尾的等号去掉
* SGVsbG/Dv+e8lueggea1i+ivlQ
* 可以看到末尾的等号已经没有了
* 实际上有没有等号对于解码来说是没有影响的
*
*/
// String b64 = Base64.getEncoder().encodeToString(original.getBytes("UTF-8"));
// String b64 = Base64.getEncoder().withoutPadding().encodeToString(original.getBytes("UTF-8"));
/**
* 这样我们就可以实现Base64的URL编码,
* SGVsbG_Dv-e8lueggea1i-ivlQ
* 在java中base64的url编码
* 它会把加号变成减号,把斜杠变成下划线
* 这样我们在传递URL参数的时候,
* 就不会引起冲突
*
*/
String b64 = Base64.getUrlEncoder().withoutPadding().encodeToString(original.getBytes("UTF-8"));
/**
* 我们打印一下base64编码
*
* SGVsbG/Dv+e8lueggea1i+ivlQ==
* 第一行就是通过base64编码编码出的字符串
* 最后两个等号就是我们添加的两个字节
*/
System.out.println(b64);
/**
* 如果我们要解码base64,
* 我们用Base64.getDecoder().decode就可以还原出原始的byte数组,
* 然后我们通过new String传入UTF-8,
* 把这个byte数组还原成String
*/
// String ori = new String(Base64.getDecoder().decode(b64), "UTF-8");
String ori = new String(Base64.getUrlDecoder().decode(b64), "UTF-8");
System.out.println(ori);
}
}
最后我们总结一下:
1. Base64编码它是一种编码算法,不是一种加密算法
2. Base64编码的目的是把任意二进制数据编码为文本,他的代价是长度增加了三分之一
3. 还有一些类似于Base64的编码,例如Base32,Base48,Base58等