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;是一种…

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

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

@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;漏洞被利…

数据库选型经验汇总

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

RabbitMQ和Kafka选型用哪个

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

spring boot maven项目返回值乱码的解决方法

spring boot maven项目返回值乱码的解决方法 1、先看乱码效果&#xff1a; spring boot maven项目&#xff0c;返回值乱码&#xff0c;如下图&#xff1a; 控制台打印log乱码&#xff0c;如下图&#xff1a; 有swagger的话&#xff0c;swagger文档乱码&#xff0c;如下图&…

【错误记录】Invalid character found in method name. HTTP method names must be tokens

错误日志 [2020-08-14 10:47:11.262] [http-nio-8093-exec-7] [INFO] [o.a.c.h.Http11Processor] [Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.] java.lang.IllegalArgumentException: Invali…

redis 常见基础面试题

1、在项目中缓存是如何使用的&#xff1f;为什么要用缓存&#xff1f;缓存使用不当会造成什么后果&#xff1f; 面试官心理分析 这个问题&#xff0c;互联网公司必问&#xff0c;要是一个人连缓存都不太清楚&#xff0c;那确实比较尴尬。 只要问到缓存&#xff0c;上来第一个…

【转载】广告系统架构解密

广告、增值服务、佣金&#xff0c;是互联网企业最常见的三种盈利手段。在这3大经典中&#xff0c;又以广告所占的市场份额最大&#xff0c;几乎是绝大部分互联网平台最主要的营收途径&#xff0c;业务的重要性不言而喻。 从技术角度来说&#xff0c;广告业务涉及到 AI算法、大数…

【读书笔记】--- 《码出高效:java开发手册》

这几天读了几本书&#xff0c;突然觉得可以写点什么&#xff0c;因为我也看了不少书了&#xff0c;于是就有了个想法&#xff0c;我可以在我看过的每本书后&#xff0c;把我的一些想法记录下来&#xff0c;一方面可以供以后回忆&#xff0c;一方面可以让读者看到后&#xff0c;…

quartz 报错:Failure obtaining db row lock: Table ‘test.QRTZ_LOCKS‘ doesn‘t exist

问题&#xff1a; spring-boot 整合quartz的时候&#xff0c;连接windows的mysql的时候好好的&#xff0c;然而用linux上的mysql的时候&#xff0c;启动就报了这个错&#xff1a; Failure obtaining db row lock: Table ‘test.QRTZ_LOCKS’ doesn’t exist 分析&#xff1a…

关于SimpleDateFormat线程不安全的源码分析

SimpleDateFormat&#xff0c;线程不安全&#xff0c;源码分析 1、先看SimpleDateFormat类图 SimpleDateFormat继承了DateFormat DateFormat中有个成员变量是Calendar&#xff0c;这个先记住&#xff0c;线程不安全主要就是因为这个成员变量 2、看下图SimpleDateFormat的p…