分享

Java、JS、OC、Flutter的Base64编码和解码

 程序员读书空间 2022-11-17 发布于浙江

题记——

    夕阳之间,天外之天,梅花清幽,独立春寒。


本文章将描述在 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个二进制位,即四个字节

    • 第五步 将补位后的32个二进制位的数据转为10进制即 Base64的十进制值,然后再从Base64编码表获取十进制对应的Base64编码,如上述的 18 对应的是 S ,6对应的是G ,21对应的是 V。  

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多