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");
}