Base64编码的原理与常用实现

这篇主要是为了后面好介绍加密算法,做的铺垫。
这个是基础,什么是一个程序员的涵养,这些基础就是涵养。
平时可能用不到,但必须得会。
如果连这个原理都说不上来,就别玩王者荣耀绝地求生英雄联盟和平精英了,该好好补补了。

Base64编码定义

Base64编码是基于64个字符的编码方式。
所有的二进制数据都可以用这64个编码来表示。
怎么编码,64个字符有哪些,是基于一个规范的:RFC2045

Base64编码特点

Base64编码是可逆的。
编码后的结果,没有任何可读性。
适用性广泛,任何能转成二进制数的数据都能Base64编码。

Base64编码原理

Base64编码入参是二进制数
首先有个编码对照表,索引从0到63总共64个,对应着(A-Z)加(a-z)加(0-9)加(+)加(/)刚好64个字符。
在这里插入图片描述
编码有以下几步:
1、将数据拆成若干组,每组3个字节,即24位。
2、每组数据24位进行重组,分为4部分,那么每部分就是6位。
3、将每部分的高位补两个0,那么每部分都成8位了,即一个字节。此时这个组总共就是4个字节。
4、将每个字节的值换成10进制,由于高两位都是0,所以该字节的十进制数,最大就是63,最小是0,正好和上面的64个编码表的索引对上,然后得到对应字符。合起来就是最终编码的值。

如果数据的总字节数,不是3的倍数,那么就存在最后一组不够3个字节。这种情况,就还是按照上面的编码规则继续编(字节换成位,每6位高位补两个0变成一个字节)
情况1:
最后一组只有两个字节,那就是16位,
前6位,高位补两个0 ,变成一个字节,对照表拿到对应的第一个字符;
中间6位,高位补两个0 ,变成一个字节,对照表拿到对应的第二个字符;
后4位,高位补4个0,变成一个字节,对照表拿到对应的第三个字符;
第四个字符默认用=代替。
情况2
最后一组只有一个字节,那就是8位,
前6位,高位补两个0 ,变成一个字节,对照表拿到对应的第一个字符;
后2位,高位补6个0,变成一个字节,对照表拿到对应的第二个字符;
第三个字符和第四个字符默认都用=代替。

这也就是为什么,有时候看到的编码结果,结尾会有=或者==,就是这种不够的情况。
另外,每76个字符加一个换行符,这个是规定。

解码就反过来操作,是不是很简单。不考虑性能的话,完全可以自己尝试写一个Base64编码工具类玩玩。

Base64衍生编码方式

Base 16
Base 32
Url Base64

看过Base64的原理,Base16和Base32的就类似了,都是拆字节,然后高位补0,使得新的字节,最大是16或者32,然后照着表找对应字符。

url Base64的出现,是因为标准的Base64,最后两个字符+/在url中不能作为参数,所以url Base64主要改动就是把这两个字符换成了-和_。

Base64编码常见实现

Base64的实现有很多种,常见的两个:JDK的和Apache的

JDK的Base64
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;public class Base64Test {public static void main(String[] args) throws IOException {String str = "hello word";BASE64Encoder base64Encoder = new BASE64Encoder();// JDK Base64加密String encode = base64Encoder.encode(str.getBytes());System.out.println(encode);BASE64Decoder base64Decoder = new BASE64Decoder();// JDK Base64解密byte[] bytes = base64Decoder.decodeBuffer(encode);String res = new String(bytes);System.out.println(res);}
}
Apache的Base64

引入pom依赖:

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version>
</dependency>
import org.apache.commons.codec.binary.Base64;public class ApacheBase64Test {public static void main(String[] args) {String str = "hello word";// Apache Base64加密byte[] encodeBytes = Base64.encodeBase64(str.getBytes());System.out.println(new String(encodeBytes));// Apache Base64解密byte[] decodeBytes = Base64.decodeBase64(encodeBytes);System.out.println(new String(decodeBytes));}
}

当然,上面两个的结果都是:

aGVsbG8gd29yZA==
hello word

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

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

相关文章

MD5算法原理与常用实现

目录定义MD5特点常见应用场景1、校验文件的完整性2、存储用户密码原理1、填补信息2、拿到初始值3、真正的计算MD5为什么不可逆java实现和使用定义 MD全称Message-Digest&#xff0c;即信息摘要&#xff0c;所以MD家族的算法也叫信息摘要算法 MD家族有MD2、MD3、MD4、MD5&#…

SHA算法原理与常用实现

看本文前&#xff0c;最好先看看之前的这一篇关于MD5算法的介绍。 MD5算法原理与常用实现 本文目录定义MD5和SHA-1的碰撞问题常见应用场景1、类似MD5的应用场景2、比特币3、https签名算法会用到SHA-256算法原理1、填补信息2、拿到初始值3、真正的计算java实现和使用定义 SHA算…

MAC算法原理与常用实现

看本文前&#xff0c;最好先看看之前的对于MD5算法和SHA算法的介绍。 本文目录定义常见应用场景1、linux客户端&#xff1a;SecureCRT2、Google身份验证器3、银联pos机终端原理java实现和使用定义 MAC&#xff08;Message Authentication Codes&#xff09;&#xff0c;是一种…

对称加密算法原理与常用实现

目录定义常用对称加密算法DES3DESAESPEB常用对称加密算法的java实现DES实现3DES实现AES实现PEB实现定义 原文通过加密秘钥生成密文&#xff0c;密文通过解密秘钥得到原文。 对于加密秘钥和解密秘钥是相同的算法&#xff0c;就叫对称加密算法。 常用对称加密算法 DES Data E…

面试 HTTP ,99% 的面试官都爱问这些问题

HTTP 和 HTTPS 的区别HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol)&#xff0c;HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范HTTP 主要内容分为三部分&#xff0c;超文本&#xff08;Hypertext&#xff09;、传输…

非对称加密算法 --- RSA签名算法

目录RSA原理RSA应用场景RSA加密场景RSA签名场景RSA加解密和签名算法的java实现RSA原理 通过一定的规则&#xff0c;生成公钥和私钥&#xff0c;公钥和私钥总是成对出现。 公钥可以公开出去&#xff0c;任何人都可以知道。 私钥只有自己知道。 RSA算法能保证&#xff0c;公钥加…

@JsonFormat失效解决

先说结论 JsonFormat失效&#xff0c;换成JSONField就好了 问题经过和原理 JsonFormat作为Date类型的属性值&#xff0c;返回前端格式化处理&#xff0c;很方便。 比如&#xff1a; JsonFormat(pattern "yyyy/MM/dd HH:mm:ss")private Date updateTime;返回给前端…

如何在摆摊经济中脱颖而出

最近&#xff0c;摆摊经济开始火了起来&#xff0c;于是各路诸侯纷纷举起大旗开始摆摊。我周围也不乏有亲朋好友蠢蠢欲动&#xff0c;有的甚至已经初有规模。但这波摆摊风是否真的可行&#xff0c;对谁可行&#xff0c;有哪些风口&#xff0c;有哪些坑&#xff0c;我们慢慢分析…

java 实现 生成短链接服务

java实现短链接转换服务 类似上图这种短信&#xff0c;对应的就是一个短链接。 看到原理也不难&#xff0c;于是先写个最简易版的玩玩&#xff0c;以后有需求了再补充吧 下面是一个简易版的短链接生成代码 搭个spring-boot服务&#xff0c;复制这两个controller&#xff0c;就…

[转载] --- Fastjson1.2.68版及以下全版本远程代码执行漏洞通告

再这样&#xff0c;真的要放弃fastjson了 【安全通告】Fastjson <1.2.68全版本远程代码执行漏洞通告 尊敬的腾讯云用户&#xff0c;您好&#xff01;近日&#xff0c;腾讯云安全运营中心监测到&#xff0c;Fastjson <1.2.68版本存在远程代码执行漏洞&#xff0c;漏洞被利…

[记录] --- safari浏览器对于yyyy-MM的坑

问题 后端给前端返回的带格式的日期类型时&#xff0c;很多时候都是yyyy-MM-dd格式的&#xff0c;在一般浏览器中都没问题&#xff0c;但safari浏览器就会出问题。 解决&#xff1a; 换成yyyy/MM/dd格式

数据库选型经验汇总

数据库选型 下面这些都是免费开源的。 暂且不考虑数据量&#xff0c;大致的选型方案。 一般分析型数据库&#xff0c;都是可以支持GB到TB级别。 上面的分类都不是一定的&#xff0c;只是大体上的推荐。具体还得结合实际场景调整。 数据处理大致可以分成两大类&#xff1a; 联…

excel导出经验

excel导出经验&#xff0c;供参考 数据量&#xff1a;1万以下 直接导出&#xff0c;正常在5秒内 数据量&#xff1a;1万-10万 直接导出&#xff0c;正常在10秒内 数据量&#xff1a;超过10万&#xff0c;建议多文件导出。 可使用多线程查询&#xff0c;比如一个线程查1万…

LeetCode删除排序数组中的重复项(Java实现)

原题&#xff1a; 给定一个排序数组&#xff0c;你需要在 原地 删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: …

关于高考报志愿的一些规划建议

目录前言1、报志愿&#xff0c;选大学中国大学的档次报志愿的整体思路不同分数线的报志愿建议超出一本分数线100分以上超过一本分数线50分左右到100分刚刚超过一本分数线不到50分二本分数线超很多&#xff0c;但刚好没上一本分数线刚上二本分数线的三本分数线专科分数线选择大学…

RabbitMQ和Kafka选型用哪个

作为一个有丰富经验的微服务系统架构师&#xff0c;经常有人问我&#xff0c;“应该选择RabbitMQ还是Kafka&#xff1f;” 基于某些原因&#xff0c; 许多开发者会把这两种技术当做等价的来看待。的确&#xff0c;在一些案例场景下选择RabbitMQ还是Kafka没什么差别&#xff0c…

spring boot controller 增加指定前缀的两种方法

1、增加配置 server.servlet.context-path: /api 这种是最常见的&#xff0c;加上这个配置后&#xff0c;所有的url&#xff0c;必须带上/api的前缀&#xff0c;才能访问到该url 2、过滤拦截 这种是加上/api也可以访问&#xff0c;不加/api也可以访问&#xff0c;适合项目重…

【FPGA】分享一些FPGA视频图像处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

错误记录:Current request is not a multipart request

springboot 报错&#xff1a;Current request is not a multipart request 这个一般是controller是带有上传文件的服务&#xff0c;类似RequestParam MultipartFile[] file 解决&#xff1a; 首先检查请求头中的Content-Type是否设置对&#xff0c;如果把Content-Type设置成a…

java 使用gzip压缩和解压 传输文件必备

java gzip 压缩解压工具类&#xff0c;开箱即用 gzip原理看我另外一篇介绍 压缩效果直接看图&#xff1a; package com.yeahmobi.datacheck.util;import java.io.*; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream;public class CompressUtil…