Base64編碼
字符對應表
上表就是用來表示Base64,一共64個字符,A-Z,a-z,0-9,+,/(上表打錯了),還有=(作為補位)
無論將文件,字符串,還是什么轉為Base64,一定是用上表的字符表示。
轉換方式是將三個字節分為一個單元,因為一個字節占8位,所以一個單元就是24位,然后將一個單元又分為四個部分,每一部分 是6位,在每個部分前面補00,於是一個單元就變成了32位,也就是4個字節,然后算出每一部分的十進制,再對應Base64字符對應表上面的 符號,一單元的四個部分加起來就是Base64,說得比較抽象,我們用圖來說話
如上圖我們對字符串"LIU"進行Base64編碼,因為剛好為3個字節,所以為一個單元,LIU對應的ASCII碼為76,73,85,對應的二進制分別為 01001100,01001001,01010101,然后將其分為四部分並補0后為,00010011,00000100,00100101,00010101,它們所對應的Base64 索引和字符為,19(T) , 4(E) , 37(l) , 21(V) , 所以"LIU"編譯后的Base64編碼為"TElV"
如果是兩個字節
兩個字節的情況分為三組,第三組只有四位(1001),這時候要再首尾都加2個0,為(00100100),計算出來是 TEk ,因為只有兩個字節,所以第三個用=代替,加上=, 為 TEk=
如果一個字節
一個字節則分為兩組,第二組為00,前面補00,后面補0000,為(00000000),在Base64上面對應A,所以為"TA",因為為一個字節,所以后兩個用==代替,為 TA==
漢字轉為Base64編碼
對於漢字轉Base64編碼,首先要確定編碼方式,又utf-8,utf-16,utf-32,gbk等等,每種編碼的漢字對應的Base64是不相同的,比如"劉"的編碼方式為utf-8 ,那么用Base64編碼后為5YiY,如果編碼方式為utf-16,那么經過Base64編碼后為/v9SGA==,所以不同的編碼方式對應不同的Base64編碼, 如果用utf-8編碼的文字轉為Base64編碼,用utf-16對Base64進行解碼,那么解碼得到的將為亂碼。
JAVA API
編碼
Base64.getEncoder().encode(byte[] bytes); Base64.getEncoder().encodeToString(byte[] bytes);
and so on
解碼
Base64.getDecoder().decode(byte[] bytes); and so on
示例
/** * TODO * * @author 劉牌 * @version 1.0 * @date 2021/9/7 0007 21:25 */ public class Base64Test { public static void main(String[] args) { String str = "LIU"; String s = Base64.getEncoder().encodeToString(str.getBytes(Charset.forName("utf-16"))); System.out.println(s); byte[] bytes = Base64.getDecoder().decode(s.getBytes()); String s1 = new String(bytes, Charset.forName("utf-16")); System.out.println(s1); } }