前言
Base64 編碼會(huì)將字符串編碼得到一個(gè)含有 A-Za-z0-9+/ 的字符串。
base64 編碼和解碼網(wǎng)上有些地方稱為 base64 加密和解密,這是不準(zhǔn)確的。base64 是不能用來加密和解密的,它只是一種編碼解碼方式,不能用于加密和解密,如果你想加密和解密可以選擇如 AES、RSA 等加密算法。
標(biāo)準(zhǔn)的 Base64 并不適合直接放在 URL 里傳輸,因?yàn)閁RL編碼器會(huì)把標(biāo)準(zhǔn) Base64 中的“/”和“+”字符變?yōu)樾稳?“%XX” 的形式,而這些 “%” 號(hào)在存入數(shù)據(jù)庫(kù)時(shí)還需要再進(jìn)行轉(zhuǎn)換,因?yàn)?ANSI SQL 中已將“%”號(hào)用作通配符。
一、base64編碼和解碼
1.標(biāo)準(zhǔn)的 base64 有填充的編碼與解碼
在 Base64 編碼中,輸出編碼字符串的長(zhǎng)度必須是 3 的倍數(shù)。如果不是 3 的倍數(shù)編碼器會(huì)根據(jù)需要在編碼結(jié)尾添加一個(gè)或兩個(gè)填充字符 “=” 以滿足此要求。在解碼時(shí),解碼器會(huì)丟棄結(jié)尾的那些額外的填充字符進(jìn)行解碼。
開發(fā)中一般都使用此方法進(jìn)行 base64 編碼與解碼,就像下面這樣:
//Base64編碼
String str = "hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy測(cè)試,base64測(cè)試加密解密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測(cè)試,base64測(cè)試加密解密hgdjuytiytiuyuytiuyirytr
System.out.println(decodedString);
你會(huì)發(fā)現(xiàn)上面的標(biāo)準(zhǔn)的 base64 編碼后的字符串除了大小寫字母和數(shù)字還會(huì)有 +、/ 這兩個(gè)符號(hào),這不太適合用于 url 傳輸或作為 url 中的參數(shù),就像前言中說的那樣,如果要用于 url,可以采用 getUrlEncoder 和 getUrlDecoder 的 base64 編碼:
//Base64編碼
String str = "hello!你好,小明!哈/哈哈,你去哪?sgdr56+=/*&yyy測(cè)試,base64測(cè)試加密解密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測(cè)試,base64測(cè)試加密解密hgdjuytiytiuyuytiuyirytr
System.out.println(decodedString);
2. base64無填充的編碼與解碼
無填充的編碼編碼后的字符串結(jié)尾不會(huì)添加 “=” 字符。
//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 類進(jìn)行 base64 編碼和解碼,jdk 的 BASE64Decoder 類也提供了 base64 編碼和解碼。
但是不推薦使用 BASE64Decoder 類進(jìn)行編碼和解碼。
因?yàn)?BASE64Decoder 是對(duì)MIME友好的,編碼后的字符串如果超過76個(gè)字符就會(huì)換行,所以 BASE64Decoder 編碼后的字符串會(huì)后 \n\r 這樣的字符,在一些處理 \n\r 的代碼里可能會(huì)有問題。如果你非要使用 BASE64Decoder 類進(jìn)行編碼和解碼,請(qǐng)使用replaceAll(“\r|\n”, “”) 對(duì)編碼后的 \n和 \r 進(jìn)行替換。文章來源:http://www.zghlxwxcb.cn/news/detail-556267.html
二、MIME友好型base64編碼和解碼
MIME 友好型 base64 編碼和解碼即編碼后如果長(zhǎng)度每大于 76 就會(huì)加入 \r\n 這樣的換行控制符文章來源地址http://www.zghlxwxcb.cn/news/detail-556267.html
//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
到了這里,關(guān)于java base64編碼和解碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!