Java Base64 Encode与Decode
一、简介
Base64是一种二进制文本编码模式,它被表示为可打印的ASCII字符,其中每个Base64字符包含6位的二进制信息。
Java提供了一个类java.util.Base64来处理加密,可以使用此类提供的方法对数据进行加密和解密。
二、Base64原理
在Base64中,有64个字符用于编码二进制数据:52个大小写字母[a-zA-Z]、10个数字[0-9]和2个特殊字符[+/]。
在计算机中,数字是用2的幂来表示的,因此Base64的64个字符可以用6位表示(2的6次幂=64)。例如:字符串ABC的编码过程如下:
-  
ABC的ASCII码值分别为:65 66 67
 -  
将ASCII码值转为八位二进制分别为:
01000001 01000010 01000011 -  
将上面的二进制数重新按六位排列:
010000 010100 001001 000011 -  
将上面的结果转为十进制分别为:16 20 9 3
 -  
查找Base64字母表,分别转换为Base64字符:QUJD
 
三、样例
1、基本的编码与解码
使用Java在RFC 4648和RFC 2045中指定的Base64字母表进行编码和解码操作,编码器不添加任何行分隔符字符,解码器拒绝包含base64字母表以外字符的数据。
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
public static void main(String[] args) {
	Encoder encoder = Base64.getEncoder();
	String text = "Hello World";
	//Encoding
	String str = encoder.encodeToString(text.getBytes());
	System.out.println("Encoded string: " + str);
	//Decoding
	Decoder decoder = Base64.getDecoder();
	String ret = new String(decoder.decode(str));
	System.out.println("Decoded string: " + ret);
}
输出:
Encoded string: SGVsbG8gV29ybGQ=
Decoded string: Hello World
URL和MIME方式的编码解码与此类似,只是获取编码和解码器的方法不同。
2、URL和文件名的编码与解码
使用Java在RFC 4648中指定的Base64字母表进行编码和解码操作,编码器不添加任何行分隔符字符,解码器拒绝包含base64字母表以外字符的数据。
public static void main(String[] args) {
	Encoder encoder = Base64.getUrlEncoder();
	String text = "https://translate.google.cn/?sl=auto&tl=zh-CN&op=translate";
	//Encoding
	String str = encoder.encodeToString(text.getBytes());
	System.out.println("Encoded string: " + str);
	//Decoding
	Decoder decoder = Base64.getUrlDecoder();
	String ret = new String(decoder.decode(str));
	System.out.println("Decoded string: " + ret);
}
3、MIME编码与解码
使用Java在RFC 2045中指定的Base64字母表进行编码和解码操作,编码的输出必须以每行不超过76个字符的形式表示,并使用回车\r紧接着换行\n作为行分隔符。在编码输出的末尾没有添加行分隔符。在解码操作中,所有行分隔符或 在base64字母表中未找到的其他字符将被忽略。
public static void main(String[] args) {
	Encoder encoder = Base64.getMimeEncoder();
	String text = "Hello, \nNice to meet you.";
	//Encoding
	String str = encoder.encodeToString(text.getBytes());
	System.out.println("Encoded string: " + str);
	//Decoding
	Decoder decoder = Base64.getMimeDecoder();
	String ret = new String(decoder.decode(str));
	System.out.println("Decoded string: " + ret);
}
4、使用Apache Commons Code
- 引入依赖包
 
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>
- 样例
 
String text = "Hello World";
String encodedString = new String(Base64.encodeBase64(text.getBytes()));
System.out.println(encodedString);
String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));
System.out.println(decodedString);
- 输出
 
SGVsbG8gV29ybGQ=
Hello World
5、Base64字符串与文件的转换
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.commons.codec.binary.Base64;
public static String encode(String pathname) throws Exception{
	File file = new File(pathname);
	try(FileInputStream fis = new FileInputStream(file)){
		try(ByteArrayOutputStream out = new ByteArrayOutputStream()){
			byte[] bs = new byte[1024];
			int len = -1;
			while((len = fis.read(bs)) != -1) {
				out.write(bs, 0, len);
			}
			return Base64.encodeBase64String(out.toByteArray());
		}
	}
}
public static void decode(String base64String, String pathname) throws Exception{
	try(FileOutputStream out = new FileOutputStream(pathname)){
		byte[] result = Base64.decodeBase64(base64String);
		out.write(result);
	}
}
public static void main(String[] args) throws Exception{
	//encode
	String result = encode("G://Spring.java");
	System.out.println(result);
	//decode
	decode(result, "G://result.txt");
}