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

** 你可能需要
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。

Java、JS、OC、Flutter的Base64编码和解码相关推荐

  1. Js对字符串进行base64编码和解码,中文报错:Failed to execute ‘btoa‘ on ‘Window‘: The string to be encoded contains cha

    我最早使用的是atob和btoa这两个函数,但是会出现报错. 直接使用封装好的方法: /*** 编码base64*/ function Encode64(str) {return btoa(encod ...

  2. java解码base64的png图片_使用PHP对图片进行base64编码和解码(png、jpg,声音、视频)...

    为什么要对图片base64编码 base64是网络上最常见的传输8Bit字节代码的编码方式之一.base64主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输.由于一些二进制字符在传输 ...

  3. android Java BASE64编码和解码二:图片的编码和解码

    1.准备工作 (1)在项目中集成 Base64 代码,集成方法见第一篇博文:android Java BASE64编码和解码一:基础 (2)添加 ImgHelper 工具类 package com.a ...

  4. Java实现Base64编码和解码的方式

    Base64 编码是什么? Base64 是一种编码的方式, 并不是安全领域的加密解密算法. Base64 的目的是把一些二进制符转成普通字符, 方便在网络上传输. 因为有些系统只能使用ASCII字符 ...

  5. 用 JS 进行 Base64 编码、解码

    从IE10+浏览器开始,所有浏览器就原生提供了 Base64 编码.解码方法,不仅可以用于浏览器环境,Service Worker 环境也可以使用. 方法名就是 atob 和 btoa ,具体语法如下 ...

  6. Java 8中的Base64编码和解码

    转自:https://juejin.im/post/5c99b2976fb9a070e76376cc Java 8会因为将lambdas,流,新的日期/时间模型和Nashorn JavaScript引 ...

  7. Java(35):Java Base64编码和解码工具类

    Java Base64编码和解码工具类 Base64Util工具类: package com.ciphergateway.utils; import java.io.UnsupportedEncodi ...

  8. js php base64,JavaScript实现Base64编码与解码的代码详解

    本篇文章给大家分享的是jJavaScript实现Base64编码与解码的代码详解,内容挺不错的,希望可以帮助到有需要的朋友 一.加密解密方法使用//1.加密 var str = '124中文内容'; ...

  9. Linux上的js解码,使用JavaScript实现Base64编码与解码

    我们知道,浏览器的window对象提供有window.atob()和window.btoa()方法可以对字符串进行Base64编码和解码. console.log(window.btoa(window ...

最新文章

  1. linux 修改图片的尺寸
  2. 这么奇葩搞笑的代码注释你见过吗
  3. waitpid()函数
  4. CSDN审核机制有点迷惑,决定逐步搬迁到简书
  5. 多种Map简单使用和测试
  6. [Android]利用金山词霸API实现英汉互译APP
  7. skynet master/slave 模式
  8. 冠骋信息正式加入重庆市医疗器械行业协会
  9. 力扣 2104. 子数组范围和
  10. php实现钟表,用html5实现一个简单的钟表外观
  11. Java使用aspose生成简历
  12. Flutter仿网易云音乐 ---基础准备
  13. 【数据库基础知识六】内连接、外连接、自连接
  14. 计算机语言词汇量,汉语作为第二语言的词汇量测量工具研究
  15. 中外合作计算机专业的大学排名,2017中外合作办学大学排名
  16. 为什么不要去小公司上班?这是我血与泪的教训!!!
  17. PMM 监控原理以及部署
  18. 电脑防火墙未使用推荐的设置来保护计算机,防火墙无法使用推荐设置,
  19. fedora 27字体美化达到ubuntu级别
  20. Unity 中的音乐可视化

热门文章

  1. ECCV 2020 | 视觉引导的声源分离辅助立体声重构方法 Sep-Stereo
  2. Github 1300+ 星!旷视开源的深度强化学习绘画智能体论文解读
  3. os.getcwd上两级_Python os.getcwd() 方法
  4. 重磅 | 阿里AI labs百万美元年薪聘请两位顶级视觉科学家
  5. Pandas-DataFrame基础知识点总结
  6. 深度学习与TensorFlow:FCN论文学习笔记
  7. android 动态申请权限_你真的了解Android权限机制吗?
  8. 2016下半年网络规划设计师考试上午真题
  9. linux 真实内存,Linux计算真实可用内存
  10. redis最基础的入门教程