本文共 2728 字,大约阅读时间需要 9 分钟。
Base64最早应用于解决电子邮件传输中的问题。在早期,电子邮件系统由于历史原因,只允许传输ASCII码字符。当尝试传输包含非ASCII字符的附件时,经过“历史问题”网关的处理可能导致非ASCII字符的二进制最高位被置为0,进而导致邮件收件人看到一封纯粹的乱码邮件。因此,Base64编码应运而生。
Base64是一种编码方式,而非加密方式。电子邮件附件通常采用Base64编码,因为这类附件可能包含不可见字符。尤其是根证书等需要在网上下载的证书,也会采用Base64编码。
Base64是一种将任意二进制数据转换为ASCII字符串的编码方法,广泛应用于URL、Cookie、网页等场景中,用于传输小段二进制数据、数字证书签名和加密密钥。
例如,将“123456”转换为二进制后得到: 00110001 00110010 00110011 00110100 00110101 00110110 将其分为6组6位二进制数,每组分别进行Base64编码,得到: 001100 010011 001000 110011 001101 000011 010100 110110 最终对应的Base64字符串为:MTIzNDU2
由于Base64编码可能包含+、/和等号,这些字符在URL中可能会引起问题。因此,常常会采用“URL safe”的编码方式,将+替换为-,/替换为_,并去掉或替换等号。这种编码方式更适合在URL、Cookie等场景中使用。
以下是一个Java实现的Base64编码与解码工具类代码示例:
public class Base64Util { public static String encode(String src) { BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode(src.getBytes()); return encode; } public static String decode(String encode) throws Exception { BASE64Decoder decoder = new BASE64Decoder(); byte[] bytes = decoder.decodeBuffer(encode); return new String(bytes); } /** * 将Base64编码结果中的敏感字符+、/、=转换为_、-、.,并去除空格。 * @param source * @return * @throws Exception */ public static String urlSafeEncode(byte[] source) { BASE64Encoder encoder = new BASE64Encoder(); String str = encoder.encode(source); str = str.replaceAll("\\+", "_"); str = str.replaceAll("/", "-"); str = str.replaceAll("=", "."); str = str.replaceAll("\\s", ""); return str; } /** * URL safe Base64解码工具类方法 * @param str * @return * @throws IOException */ public static byte[] urlSafeDecode(String str) throws IOException { if (str == null) { return null; } str = str.replaceAll("_", "+"); str = str.replaceAll("-", "/"); str = str.replaceAll("\\.", "="); BASE64Decoder decoder = new BASE64Decoder(); byte[] bytes = decoder.decodeBuffer(str); return bytes; } public static void main(String[] args) throws Exception { String encode = Base64Util.encode("123456"); String decode = Base64Util.decode(encode); System.out.println("原文:" + decode); System.out.println("编码后:" + encode); System.out.println("编码后(URL safe):" + Base64Util.urlSafeEncode("123456".getBytes())); } } 在实际应用中,可以根据需求选择是否使用URL safe编码,以确保传输过程中不会引入不必要的字符冲突。记住,编码与解码过程中需要严格按照相同的转换规则进行,以避免数据丢失或解码失败。
转载地址:http://paqfk.baihongyu.com/