网站投放,wordpress混乱,h5网站建设模板下载,个人wordpress主题这篇主要是为了后面好介绍加密算法#xff0c;做的铺垫。 这个是基础#xff0c;什么是一个程序员的涵养#xff0c;这些基础就是涵养。 平时可能用不到#xff0c;但必须得会。 如果连这个原理都说不上来#xff0c;就别玩王者荣耀绝地求生英雄联盟和平精英了#xff0c…这篇主要是为了后面好介绍加密算法做的铺垫。 这个是基础什么是一个程序员的涵养这些基础就是涵养。 平时可能用不到但必须得会。 如果连这个原理都说不上来就别玩王者荣耀绝地求生英雄联盟和平精英了该好好补补了。
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 --
dependencygroupIdcommons-codec/groupIdartifactIdcommons-codec/artifactIdversion1.14/version
/dependencyimport 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