1. Base64 加密算法
1.1 标准 Base64 算法
Base64 编码是程序开发中比较常用的一种编码算法,是常用来存储或传输一些二进制数据的方法,也是 MIME(多用途互联网邮件扩展)中的一种编码方法 。
Base64 可以实现将任何数据转换为可打印字符表示的字符串,避免数据在传输过程中失真,Base64 最开始用来在邮件发送中将非 ASCLL 字符内容转换为 ASCLL字符。
标准 Base64 是一种用于传输 8Bit 字节码的编码方式之一,基于 64 个可打印字符来表示二进制数据,使用的可打印字符包括有:A-Z、a-z、0-9、+、/ 共 64 个。
1.2 非标准 Base64 算法
UrlBase64
标准 Base64 算法中使用了 + 和 / 字符,这与 URL 以及文件系统中存在冲突,因此延伸出了一种 UrlBase64 算法,该算法中将标准 Base64 的 + 和 / 替换成为了 - 和 _ 字符。
MIME Base64
MIME Base64 算法是一种更加友好的编码格式,其定义了每行只能输出 76 个字符,如果长度超出 76,会进行换行并在行末尾增加换行符号
\r\n
, 最后一行字符长度即时不足 76,也同样会增加回车换行符号。
3. Java 实现 Base64 加解密
3.1 apache.commons-codex 包
apache.commons-codex 包中提供了的 Base64 等许多编码格式转换,可以通过其进行实现。
import org.apache.commons.codec.binary.Base64;
public class Base64Util {
//base64 编码
public static String encode(byte[] bytes) {
return new String(Base64.encodeBase64(bytes));
}
//base64 解码
public static String decode(byte[] bytes) {
return new String(Base64.decodeBase64(bytes));
}
public static void main(String[] args) {
String string = "test1234";
//编码
String encode = encode(string.getBytes());
System.out.println(string + "\t编码后的字符串为:" + encode);
//解码
String decode = decode(encode.getBytes());
System.out.println(encode + "\t字符串解码后为:" + decode);
}
}
复制代码
3.2 Java8 中的 Base64
Java8 之后,JDK 工具包中提供了 Base64 特性,可以直接使用来完成编码和解码操作。
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64Util {
final static Base64.Encoder encoder = Base64.getEncoder();
final static Base64.Decoder decoder = Base64.getDecoder();
public static String encode(String text) {
return encoder.encodeToString(text.getBytes(StandardCharsets.UTF_8));
}
public static String decode(String encodedText) {
return new String(decoder.decode(encodedText), StandardCharsets.UTF_8);
}
public static void main(String[] args) {
String str = "test1234";
System.out.println("编码后的字符串为:");
System.out.println(Base64Util.encode(str));
System.out.println("解码后的字符串为:");
System.out.println(Base64Util.decode(Base64Util.encode(str)));
}
}
复制代码
- 使用 UTF-8 指定编码和解码格式,保证操作过程中不会出现中文乱码问题,如果不指定编码格式 Base64 会使用环境默认编码格式。
- windows 下默认为 GBK 编码,而 Linux 下默认为 utf-8 编码,因此在编码和解码时指定统一的编码格式是良好的编程习惯。
3.3 非标准 Base64 编码实现
Java8 的 Base64 包中同时提供了非标准 Base64 的编码方法
UrlBase64
- Base64.getUrlEncoder()
- Base64.getUrlDecoder()
MimBease64
- Base64.getMimeEncoder()
- Base64.getMimeDecoder()
4. 图片的 Base64 编码
4.1 图片转字符串
Java 对图片编码得到 Base64 字符串
public static String GetImageStr(String imgFilePath) {
// 将图片文件转化为字节数组字符串,并进行 Base64 编码处理
byte[] data = null;
// 读取图片字节数组
try {
InputStream in = new FileInputStream(imgFilePath);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
// 返回字节数组的 Base64 编码字符串
return encoder.encode(data);
}
复制代码
- 如果需要将得到的 base64 字符串展示在 html 的 img 标签中,需要在字符串中添加
data:image/jpg;base64,
前缀
<img src="data:image/jpg;base64,..." />
复制代码
4.2 Base64 字符串转图片
对于标准的 Base64 字符串,还可以直接使用 Base64 解码方法转成图片文件,但是如果是 img 标签中的字符串,需要去掉特定的前缀后再转成图片,否则图片无法打开。
public static void base642Image(String imgData) {
// Base64 字符串判空
if (imgData == null) {
return ;
}
String imgFilePath = "C:\\Desktop\\temp\\test.jpeg";
BASE64Decoder decoder = new BASE64Decoder();
OutputStream out = null;
try {
out = new FileOutputStream(imgFilePath);
byte[] bytes = decoder.decodeBuffer(imgData);
for (int i = 0; i < bytes.length; ++i) {
if (bytes[i] < 0) {
bytes[i] += 256;
}
}
out.write(bytes);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
复制代码
版权归原作者 JavaMonsterr 所有, 如有侵权,请联系我们删除。