什么是Base64以及在Java中如何使用Base64編碼
1. Base64編碼介紹
Base64編碼: Base是MIME的一種編碼方式,MIME規(guī)范中定義了Base64編碼作為一種可靠的方式,用于在文本協(xié)議中表示二進(jìn)制數(shù)據(jù)。通過使用Base64編碼,可以將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可打印的ACSII字符,即Base64編碼是從二進(jìn)制到字符的過程,從而保證數(shù)據(jù)在傳輸過程中不受損失,并且能夠被各種文本協(xié)議(如SMTP、HTTP)正確處理。
Base64編碼與加密算法: 嚴(yán)格來說,Base64的加密解密是指編碼格式,而非加密算法。
Base64編碼的應(yīng)用: 在MIME中,當(dāng)需要在文本協(xié)議中傳輸二進(jìn)制數(shù)據(jù)(如郵件附件或圖片數(shù)據(jù))時,通常會將二進(jìn)制數(shù)據(jù)先進(jìn)行Base64編碼,然后將編碼后的數(shù)據(jù)作為文本內(nèi)容(字符串形式)進(jìn)行網(wǎng)絡(luò)傳輸,或者進(jìn)行存儲。
Bsae64編碼的格式: Base64是一種用64個字符(0-9,a-z,A-Z,+,/)來表示二進(jìn)制數(shù)據(jù)的方法,是基于64個可打印字符進(jìn)行編碼的。Base是一種索引編碼,每6個bit位作為一個單元,對應(yīng)一個字符,為了保證所輸出的編碼為可讀字符,Base64制定了一個編碼表,以便進(jìn)行統(tǒng)一轉(zhuǎn)換,編碼表的大小為2^6=64,這也是Base64名稱的由來。
Base64編碼表:
Base64編碼的原理: Base64編碼要求把3個8bit的字節(jié)(3*8=24bit)轉(zhuǎn)換為4個6bit的字節(jié)(4*6=24bit),之后在6bit位的前面補兩個0,形成8位一個字節(jié)的形式。如果剩下的字符不足三個字節(jié)(將字符串以3個字符為一組,當(dāng)最后一組不夠3個字符時),則用0補齊,以達(dá)到24個bit,當(dāng)填充后有6個bit位都為0時,則使用字符=
進(jìn)行表示,因此編碼后輸出的文本末尾可能會出現(xiàn)1或2個=
。
ASCII碼轉(zhuǎn)Base64: ASCII是8個bit為一個字節(jié),Base64是6個bit為一個字節(jié)。
示例1,正好有3個字符時: ASCII編碼you,Base64編碼eW91。
示例2,只有2個字符時: ASCII編碼yo,Base64編碼eW8=。
示例3,只有1個字符時: ASCII編碼y,Base64編碼eQ==。
2. Java實現(xiàn)Base64編碼
2.1 使用Base64進(jìn)行編碼
Base64類: 全類名為java.util.Base64,在JDK8及以上版本中,可以直接使用該類實現(xiàn)Base64編碼和解碼。如果JDK版本低于8,使用org.apache.commons.codec.binary.Base64。
使用Base64對文本進(jìn)行編碼和解碼:
@Test public void test(){ String content = "asnhlkqwe8uj12j3"; // 獲取文本的字節(jié)信息 byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 115, 110, 104, 108, 107, 113, 119, 101, 56, 117, 106, 49, 50, 106, 51] // 對文本的字節(jié)信息進(jìn)行Base64編碼 byte[] encode = Base64.getEncoder().encode(bytes);//[89, 88, 78, 117, 97, 71, 120, 114, 99, 88, 100, 108, 79, 72, 86, 113, 77, 84, 74, 113, 77, 119, 61, 61] // 將Base64編碼的字節(jié)轉(zhuǎn)換成ASCII碼對應(yīng)的字符串 String s1 = new String(encode, StandardCharsets.UTF_8);//YXNuaGxrcXdlOHVqMTJqMw== // 對文本的字節(jié)信息進(jìn)行Base64編碼,轉(zhuǎn)換成ASCII碼對應(yīng)的字符串 String s2 = Base64.getEncoder().encodeToString(bytes);//YXNuaGxrcXdlOHVqMTJqMw== // 對Base64編碼的字符串進(jìn)行解碼,獲取原始的文本的字節(jié)信息 byte[] decode = Base64.getDecoder().decode(s2);//[97, 115, 110, 104, 108, 107, 113, 119, 101, 56, 117, 106, 49, 50, 106, 51] // 將字節(jié)信息轉(zhuǎn)換成對應(yīng)的文本 String s3 = new String(decode, StandardCharsets.UTF_8);//asnhlkqwe8uj12j3 }
使用Base64對圖片進(jìn)行編碼和解碼:
@Test public void test4() throws IOException { // 獲取圖片文件 File file = new File("C:\\Users\\sq\\Desktop\\2024.png"); // 獲取圖片文件的字節(jié)信息 byte[] bytes = Files.readAllBytes(file.toPath()); // 使用Base64進(jìn)行編碼,并轉(zhuǎn)換成Base64編碼表中對應(yīng)字符組成的字符串 String s = Base64.getEncoder().encodeToString(bytes); // 將Base64編碼的字符串保存在文本文件中 Files.writeString(new File("C:\\Users\\sq\\Desktop\\te.txt").toPath(), s); // 獲取文本文件 File file1 = new File("C:\\Users\\sq\\Desktop\\te.txt"); // 獲取文本文件中保存的字符串對應(yīng)的字節(jié)信息,使用ASCII碼表示 byte[] bytes1 = Files.readAllBytes(file1.toPath()); // 將ASCII碼轉(zhuǎn)換成對應(yīng)字符串,此處s1=s String s1 = new String(bytes1, StandardCharsets.UTF_8); // 對Base64編碼的字符串進(jìn)行解碼,獲取原始的圖片文件的字節(jié)信息,此處decode=bytes byte[] decode = Base64.getDecoder().decode(s1); // 創(chuàng)建文件,將字節(jié)信息轉(zhuǎn)換成圖片 Files.write(new File("C:\\Users\\sq\\Desktop\\2024.png").toPath(),decode); }
2.2 使用Base64Utils編碼
Base64Utils: 全類名為org.springframework.util.Base64Utils,是Spring框架中的一個工具類,主要用于處理Base64編碼和解碼的操作,Base64Utils簡化了Base64編碼和解碼的過程。
對文本數(shù)據(jù)進(jìn)行編碼和解碼:
@Test public void test2(){ String content = "asnhlkqwe8uj12j3"; byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 115, 110, 104, 108, 107, 113, 119, 101, 56, 117, 106, 49, 50, 106, 51] String s1 = Base64Utils.encodeToString(bytes);//YXNuaGxrcXdlOHVqMTJqMw== byte[] decode = Base64Utils.decodeFromString(s1);//[97, 115, 110, 104, 108, 107, 113, 119, 101, 56, 117, 106, 49, 50, 106, 51] String s2 = new String(decode, StandardCharsets.UTF_8);//asnhlkqwe8uj12j3 }
2.3 URL安全相關(guān)的Base64編碼
URL不安全的Base64編碼: 如果不使用URL安全的編碼方式,URL編碼器會把標(biāo)準(zhǔn)Base64中的“/”和“+”字符變?yōu)樾稳?ldquo;%XX”的形式(即經(jīng)過Base64編碼后的字符串在通過URL參數(shù)進(jìn)行網(wǎng)絡(luò)傳輸時,瀏覽器會自動對特殊字符進(jìn)行URL編碼),而這些“%”在存入數(shù)據(jù)庫時還需要再進(jìn)行轉(zhuǎn)換(URL解碼),因為ANSI SQL中已將“%”號用作模糊查詢like的通配符。
@Test public void test2(){ String content = "ab?"; byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 98, 63] byte[] encode = Base64Utils.encode(bytes);//[89, 87, 73, 47] String s1 = Base64Utils.encodeToString(bytes);//YWI/ byte[] decode = Base64Utils.decodeFromString(s1);//[97, 98, 63] String s2 = new String(decode, StandardCharsets.UTF_8);//ab? } @Test public void test6(){ String content = "ab>"; byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 98, 62] String s1 = Base64Utils.encodeToString(bytes);//YWI+ byte[] decode = Base64Utils.decodeFromString(s1);//[97, 98, 62] String s2 = new String(decode, StandardCharsets.UTF_8);//ab> }
URL安全的Base64編碼: 將/
轉(zhuǎn)換為_
,將+
轉(zhuǎn)換為-
。
@Test public void test5(){ String content = "ab?"; byte[] bytes = content.getBytes(Standar dCharsets.UTF_8);//[97, 98, 63] byte[] bytes1 = Base64Utils.encodeUrlSafe(bytes);//[89, 87, 73, 95] String s = new String(bytes1, StandardCharsets.UTF_8);//YWI_ String s1 = Base64Utils.encodeToUrlSafeString(bytes);//YWI_ byte[] decode = Base64Utils.decodeFromUrlSafeString(s1);//[97, 98, 63] String s2 = new String(decode, StandardCharsets.UTF_8);//ab? } @Test public void test5(){ String content = "ab>"; byte[] bytes = content.getBytes(StandardCharsets.UTF_8);//[97, 98, 62] byte[] bytes1 = Base64Utils.encodeUrlSafe(bytes);//[89, 87, 73, 45] String s = new String(bytes1, StandardCharsets.UTF_8);//YWI- String s1 = Base64Utils.encodeToUrlSafeString(bytes);//YWI- byte[] decode = Base64Utils.decodeFromUrlSafeString(s1);//[97, 98, 62] String s2 = new String(decode, StandardCharsets.UTF_8);//ab> }
3. Shell使用base64編碼
編碼:
# -n表示不打印尾隨換行符 echo -n 'asnhlkqwe8uj12j3' | base64 YXNuaGxrcXdlOHVqMTJqMw==
解碼:
# 或-d echo 'YXNuaGxrcXdlOHVqMTJqMw==' | base64 --decode asnhlkqwe8uj12j3
4. js中使用base64編碼
打開瀏覽器的F12控制臺,輸入以下命令:
編碼:
window.btoa("asnhlkqwe8uj12j3") YXNuaGxrcXdlOHVqMTJqMw
解碼:
window.aotb("YXNuaGxrcXdlOHVqMTJqMw") asnhlkqwe8uj12j3
總結(jié)
到此這篇關(guān)于什么是Base64以及在Java中如何使用Base64編碼的文章就介紹到這了,更多相關(guān)Java使用Base64編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中httpclient封裝post請求和get的請求實例
這篇文章主要介紹了java中httpclient封裝post請求和get的請求實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10一行命令同時修改maven項目中多個module的版本號的方法
這篇文章主要介紹了一行命令同時修改maven項目中多個module的版本號的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06Java中多個線程交替循環(huán)執(zhí)行的實現(xiàn)
有些時候面試官經(jīng)常會問,兩個線程怎么交替執(zhí)行呀,本文就來詳細(xì)的介紹一下Java中多個線程交替循環(huán)執(zhí)行的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01Java中Spock框架Mock對象的方法經(jīng)驗總結(jié)
這篇文章主要分享了Spock框架Mock對象的方法經(jīng)驗總結(jié),下文分享一些常用項目實戰(zhàn)說明以及代碼,供大家項目中參考,也具有一的的參考價值,需要的小伙伴可以參考一下2022-02-02java Class文件內(nèi)部結(jié)構(gòu)解析過程詳解
java class的文件結(jié)構(gòu),java class文件結(jié)構(gòu)是基于字節(jié)流的,用unicode進(jìn)行編碼,下面說說java Class文件內(nèi)部結(jié)構(gòu)分析2013-11-11