打算总结一些常用的编码和加密的方式,为什么要分开写而不把全部写在同一篇,当然是为了凑字数啦。
今天就先来讲Base64,为什么先讲他,因为看起来比较容易理解。
1. Base64是什么?
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
简单来说就是把你的需要编码的串转换为 A-Z、a-z、0-9、+、/ 和 =
可以先看看索引表(网上找的)

2. 进行Base64编码
因为Base64是64个字符,所以可以使用6bit表示,就是2的6次方。
比如最大的二进制数 111111,以8bit来看比较直观,所以前两位补零00111111,转成10进制就是63,对应表就是 / ,所以最多只能有6位来表示,比如10111111 这样就没办法找对对应的索引。
那么进行Base64编码的方式就很简单了,假如有一个字符串,我们先将字符串转换为 2进制,这样的二进制一般是8位,再从左往右取6位,转换成10进制再对应索引表就行。
记住,3个字节一组,为什么3个字节一组,因为3x8=4x6
讲了这么多道理,可能有点绕,实践一些就知道了,比如下面的栗子(抄网上的)
字符串 a b c
ASCII 97 98 99
8bit 01100001 01100010 01100011
6bit 011000 010110 001001 100011
十进制 24 22 9 35
对应编码 Y W J j
一看就知道了,都不用解释是吧,随便直接再看看补位图,如果分割之后剩余的不足,也就是上面说的3x8=4x6 , 没凑够3,那就会在后面补上 =

这个也不用解释吧, 3x8=4x6 我觉得这个等式就能说明一切。
3. 特殊字符串进行编码
上面的例子看似没问题,但是会有个误导,那就是ASCII码,并不是一定要有转成ASCII码这一步,我们只需要最终转成二进制就行,不然比如emoji 比如汉字这些是没办法转成ASCII码的。
比如我现在要将 “卧槽” 进行Base64编码要怎么做?
(1)首先需要将“卧槽”转成2进制
将“卧槽”转成2进制,这又和编码方式有关,我们用的不是ASCII码,不同的编码转成的二进制不同,得到的Base64编码的结果也不同,这点需要注意
在UTF-8下:111001011000110110100111 111001101010011110111101
在Unicode下:00000000000000000101001101100111 00000000000000000110100111111101
PS:我们就以UTF-8为例。
(2)对2进制进行 3x8=4x6
按3个分组 11100101 10001101 10100111 11100110 10100111 10111101
6bit 111001 011000 110110 100111 111001 101010 011110 111101
十进制 57 24 54 39 57 42 30 61
对应编码 5Y2n 5qe9
我们验证一下,可以在随便在网上找个在线编码的

好,这就对上了,如果没对上了也没关系,因为我们上面有说过,不同的编码得到的结果不同,说不定你用的是UTF-8,但是在线编码的网站用的是Unicode
既然汉字能解决了,那设么emoji啊,其他国家的语言啊,自然不在话下
4. Base64解码
既然有编码,那自然有解码。 先看我用java写的一个Demo(binary是转二进制的方法):
String baseStr = "卧槽";
byte[] baseBytes = baseStr.getBytes();
Log.v("mmp","编码前的二进制:"+binary(baseBytes, 2));
String encodedString = Base64.getEncoder().encodeToString(baseBytes);
Log.v("mmp","编码之后的结果:"+encodedString);
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
Log.v("mmp","解码前的二进制:"+binary(decodedBytes, 2));
String decodedString = new String(decodedBytes);
Log.v("mmp","解码之后的结果:"+decodedString);
打印出结果

可以看出解码就是一个逆向的过程,使用原本的二进制进行编码,对这个Base64串解码之后会得到原本的二进制。而解码的过程也没什么好说的了,就是上面编码的过程逆过来就行。
5.其它
需要注意的是编码之后的 + / = 3个符号都是比较常用的符号,所以在传递数据时为了防止出错,可以将这3个符号替换成其它的符号。
Base64编码不仅仅能用在字符串上,对文件也能使用,是对二进制进行编码。
Base64只是编码,不是加密,Base64是可逆的,而且它生成的结果一眼就能看出来,这能瞒过谁。
网友评论