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

题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。

** 你可能需要
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。
    在这里插入图片描述
    公众号 我的大前端生涯

猜你喜欢

转载自blog.csdn.net/zl18603543572/article/details/108174275