java base64編碼和解碼用法解讀
前言
Base64 編碼會將字符串編碼得到一個含有 A-Za-z0-9+/ 的字符串。
base64 編碼和解碼網(wǎng)上有些地方稱為 base64 加密和解密,這是不準確的。base64 是不能用來加密和解密的,它只是一種編碼解碼方式,不能用于加密和解密,如果你想加密和解密可以選擇如 AES、RSA 等加密算法。
標準的 Base64 并不適合直接放在 URL 里傳輸,因為URL編碼器會把標準 Base64 中的“/”和“+”字符變?yōu)樾稳?“%XX” 的形式,而這些 “%” 號在存入數(shù)據(jù)庫時還需要再進行轉換,因為 ANSI SQL 中已將“%”號用作通配符。
一、base64編碼和解碼
1.標準的 base64 有填充的編碼與解碼
在 Base64 編碼中,輸出編碼字符串的長度必須是 3 的倍數(shù)。如果不是 3 的倍數(shù)編碼器會根據(jù)需要在編碼結尾添加一個或兩個填充字符 “=” 以滿足此要求。在解碼時,解碼器會丟棄結尾的那些額外的填充字符進行解碼。
開發(fā)中一般都使用此方法進行 base64 編碼與解碼,就像下面這樣:
//Base64編碼
String str = "hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy測試,base64測試加密解密hgdjuytiytiuyuytiuyirytr";
String encodedString = Base64.getEncoder().encodeToString(str.getBytes());
//輸出:aGVsbG8h5L2g5aW9LOWwj+aYju+8geWTiC/lk4jlk4jvvIzkvaDljrvlk6rvvJ9zZ2RyNTYrPS8qJnl5eea1i+ivle+8jGJhc2U2NOa1i+ivleWKoOWvhuino+WvhmhnZGp1eXRpeXRpdXl1eXRpdXlpcnl0cg==
System.out.println(encodedString);
//Base64解碼
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
//輸出:hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy測試,base64測試加密解密hgdjuytiytiuyuytiuyirytr
System.out.println(decodedString);
你會發(fā)現(xiàn)上面的標準的 base64 編碼后的字符串除了大小寫字母和數(shù)字還會有 +、/ 這兩個符號,這不太適合用于 url 傳輸或作為 url 中的參數(shù),就像前言中說的那樣,如果要用于 url,可以采用 getUrlEncoder 和 getUrlDecoder 的 base64 編碼:
//Base64編碼
String str = "hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy測試,base64測試加密解密hgdjuytiytiuyuytiuyirytr";
String encodedString = Base64.getUrlEncoder().encodeToString(str.getBytes());
//輸出:aGVsbG8h5L2g5aW9LOWwj-aYju-8geWTiC_lk4jlk4jvvIzkvaDljrvlk6rvvJ9zZ2RyNTYrPS8qJnl5eea1i-ivle-8jGJhc2U2NOa1i-ivleWKoOWvhuino-WvhmhnZGp1eXRpeXRpdXl1eXRpdXlpcnl0cg==
System.out.println(encodedString);
//Base64解碼
byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
//輸出:hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy測試,base64測試加密解密hgdjuytiytiuyuytiuyirytr
System.out.println(decodedString);
2.base64無填充的編碼與解碼
無填充的編碼編碼后的字符串結尾不會添加 “=” 字符。
//Base64編碼
String str = "hello!你好,小明!";
String encodedString = Base64.getEncoder().withoutPadding().encodeToString(str.getBytes());
System.out.println(encodedString); //aGVsbG8h5L2g5aW9LOWwj+aYju+8gQ
//Base64解碼
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
System.out.println(decodedString); //hello!你好,小明!
注意:
除了上面介紹的 Base64 類進行 base64 編碼和解碼,jdk 的 BASE64Decoder 類也提供了 base64 編碼和解碼。
但是不推薦使用 BASE64Decoder 類進行編碼和解碼。
因為 BASE64Decoder 是對MIME友好的,編碼后的字符串如果超過76個字符就會換行,所以 BASE64Decoder 編碼后的字符串會后 \n\r 這樣的字符,在一些處理 \n\r 的代碼里可能會有問題。
如果你非要使用 BASE64Decoder 類進行編碼和解碼,請使用replaceAll(“\r|\n”, “”) 對編碼后的 \n和 \r 進行替換。
二、MIME友好型base64編碼和解碼
MIME 友好型 base64 編碼和解碼即編碼后如果長度每大于 76 就會加入 \r\n 這樣的換行控制符
//Base64編碼
String str = "727dced7-15c7-48c6-bb11-416ab51f98bc-2a19434a-3a64-496e-b07b-b51b0445384c-22525be7-82c7-4a72-8594-238712d4d59e";
byte[] encodedAsBytes = str.getBytes();
String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);
System.out.println("編碼:"+encodedMime);
//Base64解碼
byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
String decodedMime = new String(decodedBytes);
System.out.println("解碼:"+decodedMime); //727dced7-15c7-48c6-bb11-416ab51f98bc-2a19434a-3a64-496e-b07b-b51b0445384c-22525be7-82c7-4a72-8594-238712d4d59e
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
postman中實現(xiàn)傳遞@RequestBody參數(shù)
這篇文章主要介紹了postman中實現(xiàn)傳遞@RequestBody參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
基于OpenCv與JVM實現(xiàn)加載保存圖像功能(JAVA?圖像處理)
openCv有一個名imread的簡單函數(shù),用于從文件中讀取圖像,本文給大家介紹JAVA?圖像處理基于OpenCv與JVM實現(xiàn)加載保存圖像功能,感興趣的朋友一起看看吧2022-01-01
IntelliJ?IDEA設置JVM運行參數(shù)的圖文介紹
這篇文章主要介紹了IntelliJ?IDEA設置JVM運行參數(shù)的方法,包括配置方式及優(yōu)先級,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04

