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總結
以上是生活随笔為你收集整理的Base64编码的原理与常用实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java多态可以传匿名对象吗_Java复
- 下一篇: 电子数字计算机最早应用于哪个领域,201