题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。
** | 你可能需要 |
CSDN | 网易云课堂教程 |
掘金 | EDU学院教程 |
知乎 | Flutter系列文章 |
本文章将描述在 Java、JS、OC、Flutter中通过Base64算法将String进行编码与解码,以及通过分析了Base64编码的原理过程
1 Base64编码的应用场景分析
- 如微信中昵称特殊字符的处理,在向数据库中保存编码,取用时解码。
- 可以方便的将用户的任何输入转换成只包含特定字符的安全格式
- 某些系统中只能使用ASCII字符,通过Base64可以将非ASCII字符的数据转换成ASCII字符
- 如http协议当中的key value字段,必须进行URLEncode 不然出现的等号可能使解析失败 空格也会使http请求解析出现问题
2 Java8中的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个二进制位,即四个字节
第五步 将补位后的32个二进制位的数据转为10进制即 Base64的十进制值,然后再从Base64编码表获取十进制对应的Base64编码,如上述的 18 对应的是 S ,6对应的是G ,21对应的是 V。