一、简介

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");
}
参考资料:

Java Base64 Encode and Decode

Encoding and Decoding Base64 Strings in Java