题记—— 夕阳之间,天外之天,梅花清幽,独立春寒。
本文章将描述在 Java、JS、OC、Flutter中通过Base64算法将String进行编码与解码,以及通过分析了Base64编码的原理过程
1 Base64编码的应用场景分析如微信中昵称特殊字符的处理,在向数据库中保存编码,取用时解码。 可以方便的将用户的任何输入转换成只包含特定字符的安全格式 某些系统中只能使用ASCII字符,通过Base64可以将非ASCII字符的数据转换成ASCII字符 如http协议当中的key value字段,必须进行URLEncode 不然出现的等号可能使解析失败 空格也会使http请求解析出现问题
2 Java 中的Base64编码与解码在Java7及7之前,要实代Base64编码,要么借助sun.misc.BASE64Encoder,或者apache commons-codec,再或者Guava、JAXB的DatatypeConverter,到了Java8,官方已经把Base64进行了重新优化,并直接放到了java.util包里了。实现起来,比之前的都要简单优雅,性能卓越,无需引用第三方包。 ///代码清单 1-1 public class CommonStringUtils {
///构建编码器 private final static Base64.Encoder ENCODER = Base64.getEncoder(); ///构建解码器 private final static Base64.Decoder DECODER = Base64.getDecoder();
/** * 解码 * @param str 需要解码的 String * @return 解码后的 String */ public static String decoderStr(String str) { try { // decode 解码后为byte字节数组 return new String(DECODER.decode(str), "utf-8"); } catch ( UnsupportedEncodingException e) { e.printStackTrace(); return str; } }
/** * * @param str 需要编码的字符串 * @return 返回编辑后的字符串 */ public static String endoderStr(String str) { try { return ENCODER.encodeToString(str.getBytes("utf-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return str; }
}
3 JS 中的Base64编码与解码从IE10+浏览器开始,所有浏览器就原生提供了Base64编码、解码方法,使用语法如下: //需要编码的字符串 var str =""; // 编码 var encodeStr = window.btoa(str)
//需要解码的字符串 var decodeStr = ""; //解码 var dStr = window.atob(decodeStr)
3 OC中的Base64编码与解码//需要编码的字符串 NSString *string = @""; //获取编码后的Data NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//获取编码后的 String //NSString *stringBase64 = [data base64Encoding]; // base64格式的字符串(不建议使用,用下面方法替代) NSString *stringBase64 = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; //
//需要解码的字符串 NSString *stringBase64 = @""; //获取解码后的 NSData NSData *data = [[NSData alloc] initWithBase64EncodedString:stringBase64 options:NSDataBase64DecodingIgnoreUnknownCharacters]; //获取解码后的 String NSString *string =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
4 Flutter中的Base64编码与解码使用dart:convert库进行编码解码 // base64库 import 'dart:convert' as convert; class Base64Util { ///Base64加密 static String base64Encode(String str){ /// var content = convert.utf8.encode(str); var digest = convert.base64Encode(content); return digest; }
///Base64解码 static String base64Decode(String data){ ///获取解码后的字节数组 List<int> bytes = convert.base64Decode(data); //获取解码的字条串 String result = convert.utf8.decode(bytes); return result; } }
5 Base64的编码原理Base64编码之所以称为Base64,是因为其使用64个字符来对任意数据进行编码,同理有Base32、Base16编码。 标准base64只有64个字符(英文大小写、数字和+、/、=)以及用作后缀等号 ['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
假设我们要对 Hello! 进行Base64编码,按照ASCII表,其转换过程如下图所示:
可知 Hello! 的Base64编码结果为 SGVsbG8h ,原始字符串长度为6个字符,编码后长度为8个字符,每3个原始字符经Base64编码成4个字符,编码前后长度比3/4. 对上述编码过程的总结如下: 第一步 将所有字符转化为ASCII码然后通过ASCII码获取对应的8位二进制值 第二步 将三个字符的二进制归成一组(不足3个在后边补0),然后形成共24位的二进制组
第三步 将再24位的二进制组拆分成4组,每组6位
第四步 统一在6位二进制前补两个0凑足8位,每组由6个变为8个二进制位,总共32个二进制位,即四个字节
|