一:算法由来Base64最早应用于解决电子邮件传输的问题。在早期,由于“历史问题”,电子邮件只允许ASCII码字符。如果要传输一封带有非ASCII码字符的电子邮件(例如附件),当它通过有“历史问题”的网关时就可能出现问题(网关可能会对非ASCII码字符的二进制位作调整,即将非ASCII码的8位二进制码最高位置为0)。此时用户收到的邮件会是一封纯粹的乱码邮件,由于这个原因产生了base64算法。Base64是一种编码方式,而不是一种加密方式 电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。
Base64是一种任意二进制到文本字符串的编码方法(二进制=》ASCII),Base64适用于小段内容的编码,常用于在URL、Cookie、网页中传输少量二进制数据、数字证书签名、密钥。 “123456”对应的二进制位 00110001 00110010 00110011 00110100 00110101 00110110, 我们取6个比特为一组结果为
对应的base64为:MTIzNDU2 由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种”url safe”的base64编码,其实就是把字符+和/分别变成-和_: 二:Base64Utilpublic 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种的敏感字符+,/,=转化为_,-,. 以及base64会在编码串中产生换行符 * @param source * @return */ 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; } /** * urlSafeEncode逆过程 * @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(encode); System.out.println(decode); }}
|
|