Base64编码方式的介绍及其编码解码

一、Base64是什么

        Base64是一种用于将二进制数据编码为ASCII字符的编码方式,主要目的是为了能够在文本环境中传输和存储二进制数据。这种编码方式广泛应用于电子邮件、HTTP协议和其他需要传输或存储二进制数据的地方。

二、发明Base64编码的原因

        Base64编码的发明解决了在文本环境中传输和存储二进制数据的一系列问题,通过将二进制数据转换为可打印的ASCII字符,提高了数据传输的兼容性、安全性和可靠性。

以下是几点原因及其说明:

1、兼容性:

  • 文本系统的限制:许多应用系统(例如早期的电子邮件系统和某些协议)只能处理ASCII字符集,不能直接处理二进制数据。Base64通过将二进制数据转换为可打印的ASCII字符,使其能够在这些系统中传输和存储。
  • 避免数据损坏:在传输过程中,有些字符可能会被误解释为控制字符,从而导致数据损坏。Base64通过使用可打印的字符避免了这个问题。

2、标准化

  • 通用性:Base64提供了一种标准化的方法来编码和解码二进制数据,使得不同系统和应用程序之间可以互操作,而不需要担心底层数据格式的差异。
  • 广泛支持:Base64已经成为许多协议和文件格式的组成部分,并且得到了广泛的支持。例如,JSON Web Tokens(JWT)使用Base64来编码其负载部分。

3、易读性

  • 可打印字符:Base64编码后的数据仅包含字母、数字、“+”和“/”,以及填充字符“=”。这些字符都是可打印的,这使得编码后的数据更容易阅读和调试。
  • 避免特殊字符:Base64编码避免了使用可能在某些环境中有特殊含义的字符,例如空格、换行符和其他控制字符。

4、数据完整性

  • 减少变动风险:由于Base64编码后的字符串不包含非打印字符或控制字符,因此在传输或存储过程中,不太可能因为格式转换等原因导致数据变动或丢失。

5、实现简单

  • 编码和解码算法简单:Base64的编码和解码算法相对简单,可以很容易地在各种编程语言中实现。

三、Base64编码的编码原理

        首先,准备一个包含64个ASCII码的字符数组:['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/'],这64个字符不一定需要一样,但都是ASCII码表里可见字符(关于ASCII码表可参考:ASCII码表介绍),如下:

private static final char[] toBase64 = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
};// 由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以把字符+和/分别变成-和_:
private static final char[] toBase64URL = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'
};

        接着,对二进制数据进行分割重组。因为一个字节是8位(bit)二进制组成的,共有2^9个数值(0-255),而我们上面定义的字符数组是64位的,所以需要重组成每6位(bit)二进制为一组。

        如上图,是3个字节(3x8=24bit)分割重组为4组(4x6=24bit),然后每一组的6位二进制可以转成一个数字(0-64,如,000000为0、000010为2等),这样我们得到4个数字作为索引,然后在上面定义的字符数组里获得相应的4个字符,就是编码后的字符串。

        例如,上面n1-n4分别为:000000、000010、000100、111111,则索引分别为:0、2、4、63,编码后字符串为ACE/。 

        如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节,Base64编码会在末尾补上2个或1个\x00字节(二进制00000000),使其达到3个字节(24bit),可以分为4组(4x6=24bit),再在编码后字符串的末尾加上2个或1个=号,表示补了多少字节,解码的时候,会自动去掉相应的\x00(其实有时候=号缺失也没事,程序会自动判断,取到足够数量二进制进行解码)。

        例如,要编码的二进制为1个字节,00100001(33,英文!号),分组后n1-n4分别为:001000、010000、000000、000000,则索引为8(2^3)、16(2^1),一共补上2个字节(16bit),所以编码后的字符串为IQ==。

import java.util.Base64;public static void main(String[] args) throws Exception {System.out.println(String.format("%8s",Integer.toBinaryString("!".charAt(0))).replace(" ","0"));byte[] b = {33};System.out.println(new String(Base64.getEncoder().encode(b)));System.out.println(new String(Base64.getDecoder().decode("IQ==".getBytes(StandardCharsets.UTF_8))));
}// 打印结果
二进制数据:00100001
编码后字符串:IQ==
解码后字符串:!

        所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。

四、Base64编码的解码原理

        解码原理就是反过来,字符串(如:ACE/)根据定义的ASCII码字符数组,找到各自索引,转为N组二进制(6bit/组),再分割成M个字节(8bit/字节),末尾有2个或1个=号的,会相应减去对应数量的字节,最后解码出M-2或M-1个字节。

五、Java下Base64的编码与解码

1、sun.misc下的BASE64Encoder和BASE64Decoder

优缺点:

  • 这是JDK中自带的BASE64工具;
  • 但是所提供的Base64功能编码和解码的效率并不太高,而且在JDK1.9以后就不被维护了。
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;public class Base64Test {private static final BASE64Encoder ENCODE_64 = new BASE64Encoder();private static final BASE64Decoder DECODE_64 = new BASE64Decoder();@Testpublic void sun_misc_base64_T() {String text = "需要编码的数据";try {// 编码String encodedStr = ENCODE_64.encodeBuffer(text.getBytes("UTF-8"));System.out.println("encodedStr = " + encodedStr);// 解码String decodeStr = new String(DECODE_64.decodeBuffer(encodedStr), "UTF-8");System.out.println("decodeStr = " + decodeStr);} catch (Exception e) {e.printStackTrace();}}
}

2、org.apache.commons.codec.binary下的Base64

优缺点: 

  • 与sun.misc方式比较,它的效率更高,代码更简洁;
  • 所有的JDK版本都支持
import org.apache.commons.codec.binary.Base64;public class Base64Test {private static final Base64 BASE_64 = new Base64();@Testpublic void sun_misc_base64_T() {String text = "需要编码的数据";try {// 编码String encodedStr = BASE_64.encodeToString(text.getBytes("UTF-8"));System.out.println("encodedStr = " + encodedStr);// 解码String decodeStr = new String(BASE_64.decode(encodedStr), "UTF-8");System.out.println("decodeStr = " + decodeStr);} catch (Exception e) {e.printStackTrace();}}
}

3、java.util下的Base64

优缺点:

  • java.util提供的Base64拥有更好的效能,实际测试编码与解码速度的话,比sun.misc套件提供的快至少11倍,比org.apache.commons.codec.binary提供的快至少3倍;
  • 但是,需要JDK1.8以后的版本才支持。
import org.junit.Test;
import java.util.Base64;public class Base64Test {private static final Base64.Decoder DECODE_64 = Base64.getDecoder();private static final Base64.Encoder ENCODE_64 = Base64.getEncoder();@Testpublic void sun_misc_base64_T() {String text = "需要编码的数据";try {// 编码String encodedStr = ENCODE_64.encodeToString(text.getBytes("UTF-8"));System.out.println("encodedStr = " + encodedStr);// 解码String decodeStr = new String(DECODE_64.decode(encodedStr), "UTF-8");System.out.println("decodeStr = " + decodeStr);} catch (Exception e) {e.printStackTrace();}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

202479读书笔记|《你是人间的四月天》——谁又能参透这幻化的轮回, 谁又大胆的爱过这伟大的变幻?

202479读书笔记|《你是人间的四月天》——谁又能参透这幻化的轮回, 谁又大胆的爱过这伟大的变幻? 散文诗歌书信 《你是人间的四月天(果麦经典)》作者林徽因,才女的散文,诗歌,书信集选。很值得一…

python爬虫爬电影数据

使用python 爬了下豆瓣电影,仅供学习。 目标链接主页 获取div内容 保存爬出来的数据

Java数据类型及运算符(与C语言对比)

Java和C语言在数据类型大部分相同,但是也有不同 1.新增了byte类型(相当于C语言中把char用作整数一样) 2.然后就是char类型的大小改为了2字节。 3.布尔型改名为boolean而不是bool,且大小没有明确规定,方便进行不同平台之间的移…

【QT5】<重点> IMX6ULL开发板运行QT

目录 1. 安装交叉编译器 2. 命令行交叉编译QT项目 3. 运行该可执行程序 4. 开发板上运行UDP程序与Ubuntu通信 1. 安装交叉编译器 第一步:进入正点原子论坛找到IMX6ULL开发板的资料,下载“开发工具”,将“交叉编译工具”中的fsl-imx-x11-…

网站导航在整个网站里面起到什么作用

1.网站导航相当于网站模块 网站有多少个导航内容就相当于有多少个网站模块,有了导航其实就有了整个网站的分类,这样对于网站来说就可以很好的把内容归类,然后再细分每一个细节,等于是导航可以固定了整个网站的内容架构。 2.…

搜维尔科技:SenseGlove为什么不同的手套尺寸对触觉技术至关重要

senseglove适当的尺寸可确保: 1.精确的运动跟踪:合适的手套保持部件稳定,防止不准确的运动跟踪 2.有效的力反馈:我们基于肌腱的力反馈系统通过对手套的绳子施加力来模拟肌肉的运动。不稳定的配合会影响反馈,使其感觉虚弱和柔软。 3.舒适性和敏感性:我…

如何选择可靠的代码签名证书签发机构?

软件和应用程序已成为我们日常生活和工作中不可或缺的一部分。它们不仅处理着大量的敏感数据,还执行着许多关键任务。因此,确保这些软件的安全性和完整性变得极为重要。代码签名证书作为一种关键工具,其作用在于验证软件的来源,确…

代码随想录算法训练营第36期DAY58

DAY58 今天的主题是:编辑距离。在字符串进行增删字符的操作。 392判断子序列,简单 首先想到快慢双指针: 通过了,很好: class Solution {public: bool isSubsequence(string s, string t) { int slow0; …

Android 13 高通设备热点低功耗模式(2)

前言 之前写过一篇文章:高通热点被IOS设备识别为低数据模式,该功能仿照小米的低数据模式写的,散发的热点可以达到被IOS和小米设备识别为低数据模式。但是发现IOS设备如果后台无任何网络请求的时候,息屏的状态下过一会,会自动断开热点的连接。 分析 抓取设备的热点相关的…

4、视觉里程计:特征点法、直接法和半直接法

先说一下我自己的总体理解: 特征点法,基于最小化重投影误。 提取特征点,计算描述子,匹配,运动估计。 计算描述子和匹配部分可以用光流法跟踪替代 总体上先知道像素之间的关系,在估计运动(最…

基于matlab提取一维数组中非nan的数据

一、使用逻辑索引 使用逻辑索引来选择数组中所有非NaN的元素。逻辑索引是与原数组同型的逻辑数组,true对应的位置将会被选中。 % 假设a是一维数组 a [1, 2, NaN, 4, NaN, 6];% 使用逻辑索引提取非NaN元素 non_nan_elements a(~isnan(a)); 二、使用isnan函数和fi…

计算机二级Access选择题考点

在Access中,若要使用一个字段保存多个图像、图表、文档等文件,应该设置的数据类型是附件。在“销售表"中有字段:单价、数量、折扣和金额。其中,金额单价x数量x折扣,在建表时应将字段"金额"的数据类型定义为计算。若…

WebSocket 基础使用

1.基本概念 WebSocket 支持双方通信即服务端可以主动推送给用户端,用户端也可以主动推送消息给服务器。前端必须进行协议升级为 WebSocket 名称值Upgradewebsocket 2. 后端代码 package com.koshi.websocket.server;import com.alibaba.fastjson.JSON; import com…

RBAC权限实战

一、项目结构说明、搭建以及初步验证 引入SSM框架依赖: <dependencies> <dependency> <groupId>javax.servlet…

【算法-力扣】72. 编辑距离(动态规划)

目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 1&#…

解析FTP服务器:从基础知识到vsftpd实战操作

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

组合和外观模式

文章目录 组合模式1.引出组合模式1.院系展示需求2.组合模式基本介绍3.组合模式原理类图4.解决的问题 2.组合模式解决院系展示1.类图2.代码实现1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法2.University.java 第一层&#xff0c;University 可以管理 Coll…

商城系统如何选型?

近日&#xff0c;拼多多发布618百亿补贴活动首周战报。5月19日活动启动一周内&#xff0c;百亿补贴商家参与数量相比去年618首周增长逾90%。其中&#xff0c;农产品商家同比增长83%&#xff0c;数码家电商家同比增长86%&#xff0c;美妆商家同比增长105%。 作为一家成立还不到1…

uaGate SI自动化状态监测和工业4.0解决方案

克劳斯玛菲集团&#xff08;于2016年被中国化工集团公司收购&#xff09;为其注塑和反应/挤出系统采用了uaGate SI网关技术并实行了开放且独立于平台的OPC UA标准&#xff0c;以用于设备状态自动化监控&#xff0c;这大大提高了产量并避免了机器停机问题。 自动化状态监测提高了…

文件操作学不懂,小代老师带你深入理解文件操作(下卷)

文件操作学不懂&#xff0c;小代老师带你深入理解文件操作下卷 6. ⽂件的随机读写6.1 fseek6.2 ftell6.3 rewind 7. ⽂件读取结束的判定7.1 被错误使⽤的 feof 8. ⽂件缓冲区 6. ⽂件的随机读写 6.1 fseek 根据⽂件指针的位置和偏移量来定位⽂件指针&#xff08;⽂件内容的光…