什么是Base64以及在Java中如何使用Base64編碼
1. Base64編碼介紹
Base64編碼: Base是MIME的一種編碼方式,MIME規(guī)范中定義了Base64編碼作為一種可靠的方式,用于在文本協(xié)議中表示二進(jìn)制數(shù)據(jù)。通過(guò)使用Base64編碼,可以將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可打印的ACSII字符,即Base64編碼是從二進(jìn)制到字符的過(guò)程,從而保證數(shù)據(jù)在傳輸過(guò)程中不受損失,并且能夠被各種文本協(xié)議(如SMTP、HTTP)正確處理。
Base64編碼與加密算法: 嚴(yán)格來(lái)說(shuō),Base64的加密解密是指編碼格式,而非加密算法。
Base64編碼的應(yīng)用: 在MIME中,當(dāng)需要在文本協(xié)議中傳輸二進(jìn)制數(shù)據(jù)(如郵件附件或圖片數(shù)據(jù))時(shí),通常會(huì)將二進(jìn)制數(shù)據(jù)先進(jìn)行Base64編碼,然后將編碼后的數(shù)據(jù)作為文本內(nèi)容(字符串形式)進(jìn)行網(wǎng)絡(luò)傳輸,或者進(jìn)行存儲(chǔ)。
Bsae64編碼的格式: Base64是一種用64個(gè)字符(0-9,a-z,A-Z,+,/)來(lái)表示二進(jìn)制數(shù)據(jù)的方法,是基于64個(gè)可打印字符進(jìn)行編碼的。Base是一種索引編碼,每6個(gè)bit位作為一個(gè)單元,對(duì)應(yīng)一個(gè)字符,為了保證所輸出的編碼為可讀字符,Base64制定了一個(gè)編碼表,以便進(jìn)行統(tǒng)一轉(zhuǎn)換,編碼表的大小為2^6=64,這也是Base64名稱的由來(lái)。
Base64編碼表:

Base64編碼的原理: Base64編碼要求把3個(gè)8bit的字節(jié)(3*8=24bit)轉(zhuǎn)換為4個(gè)6bit的字節(jié)(4*6=24bit),之后在6bit位的前面補(bǔ)兩個(gè)0,形成8位一個(gè)字節(jié)的形式。如果剩下的字符不足三個(gè)字節(jié)(將字符串以3個(gè)字符為一組,當(dāng)最后一組不夠3個(gè)字符時(shí)),則用0補(bǔ)齊,以達(dá)到24個(gè)bit,當(dāng)填充后有6個(gè)bit位都為0時(shí),則使用字符=進(jìn)行表示,因此編碼后輸出的文本末尾可能會(huì)出現(xiàn)1或2個(gè)=。
ASCII碼轉(zhuǎn)Base64: ASCII是8個(gè)bit為一個(gè)字節(jié),Base64是6個(gè)bit為一個(gè)字節(jié)。
示例1,正好有3個(gè)字符時(shí): ASCII編碼you,Base64編碼eW91。

示例2,只有2個(gè)字符時(shí): ASCII編碼yo,Base64編碼eW8=。

示例3,只有1個(gè)字符時(shí): ASCII編碼y,Base64編碼eQ==。

2. Java實(shí)現(xiàn)Base64編碼
2.1 使用Base64進(jìn)行編碼
Base64類: 全類名為java.util.Base64,在JDK8及以上版本中,可以直接使用該類實(shí)現(xiàn)Base64編碼和解碼。如果JDK版本低于8,使用org.apache.commons.codec.binary.Base64。
使用Base64對(duì)文本進(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]
// 對(duì)文本的字節(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碼對(duì)應(yīng)的字符串
String s1 = new String(encode, StandardCharsets.UTF_8);//YXNuaGxrcXdlOHVqMTJqMw==
// 對(duì)文本的字節(jié)信息進(jìn)行Base64編碼,轉(zhuǎn)換成ASCII碼對(duì)應(yīng)的字符串
String s2 = Base64.getEncoder().encodeToString(bytes);//YXNuaGxrcXdlOHVqMTJqMw==
// 對(duì)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)換成對(duì)應(yīng)的文本
String s3 = new String(decode, StandardCharsets.UTF_8);//asnhlkqwe8uj12j3
}
使用Base64對(duì)圖片進(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編碼表中對(duì)應(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");
// 獲取文本文件中保存的字符串對(duì)應(yīng)的字節(jié)信息,使用ASCII碼表示
byte[] bytes1 = Files.readAllBytes(file1.toPath());
// 將ASCII碼轉(zhuǎn)換成對(duì)應(yīng)字符串,此處s1=s
String s1 = new String(bytes1, StandardCharsets.UTF_8);
// 對(duì)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框架中的一個(gè)工具類,主要用于處理Base64編碼和解碼的操作,Base64Utils簡(jiǎn)化了Base64編碼和解碼的過(guò)程。
對(duì)文本數(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編碼器會(huì)把標(biāo)準(zhǔn)Base64中的“/”和“+”字符變?yōu)樾稳?ldquo;%XX”的形式(即經(jīng)過(guò)Base64編碼后的字符串在通過(guò)URL參數(shù)進(jìn)行網(wǎng)絡(luò)傳輸時(shí),瀏覽器會(huì)自動(dòng)對(duì)特殊字符進(jìn)行URL編碼),而這些“%”在存入數(shù)據(jù)庫(kù)時(shí)還需要再進(jìn)行轉(zhuǎn)換(URL解碼),因?yàn)锳NSI SQL中已將“%”號(hào)用作模糊查詢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控制臺(tái),輸入以下命令:
編碼:
window.btoa("asnhlkqwe8uj12j3")
YXNuaGxrcXdlOHVqMTJqMw
解碼:
window.aotb("YXNuaGxrcXdlOHVqMTJqMw")
asnhlkqwe8uj12j3總結(jié)
到此這篇關(guān)于什么是Base64以及在Java中如何使用Base64編碼的文章就介紹到這了,更多相關(guān)Java使用Base64編碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot對(duì)接mqtt的項(xiàng)目實(shí)踐
在SpringBoot中對(duì)接MQTT協(xié)議,可以使用Eclipse Paho客戶端和Spring Integration MQTT模塊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02
SpringBoot中WebClient的實(shí)踐過(guò)程
本文介紹了SpringBoot中WebClient的使用,包括配置、使用場(chǎng)景以及優(yōu)化策略,幫助開發(fā)者更高效地進(jìn)行服務(wù)間通信,WebClient具有非阻塞式I/O、強(qiáng)大的功能、靈活性等優(yōu)點(diǎn),適用于高并發(fā)場(chǎng)景,通過(guò)合理配置和優(yōu)化,可以顯著提升服務(wù)間通信的效率和可靠性2025-12-12
詳解springmvc控制登錄用戶session失效后跳轉(zhuǎn)登錄頁(yè)面
本篇文章主要介紹了springmvc控制登錄用戶session失效后跳轉(zhuǎn)登錄頁(yè)面,session一旦失效就需要重新登陸,有興趣的同學(xué)可以了解一下。2017-01-01
SpringBoot集成WebSocket實(shí)現(xiàn)后臺(tái)向前端推送信息
在一次項(xiàng)目開發(fā)中,使用到了Netty網(wǎng)絡(luò)應(yīng)用框架,以及MQTT進(jìn)行消息數(shù)據(jù)的收發(fā),這其中需要后臺(tái)來(lái)將獲取到的消息主動(dòng)推送給前端,所以本文記錄了SpringBoot集成WebSocket實(shí)現(xiàn)后臺(tái)向前端推送信息的操作,需要的朋友可以參考下2024-02-02
全解史上最快的JOSN解析庫(kù)alibaba Fastjson
這篇文章主要介紹了史上最快的JOSN解析庫(kù)alibaba Fastjson,對(duì)FastJson感興趣的同學(xué),一定要看一下2021-04-04
Spring Boot 中 @Scheduled 定時(shí)任務(wù)不生效的原因及解決方法
SpringBoot中@Scheduled注解用于創(chuàng)建定時(shí)任務(wù),但有時(shí)任務(wù)可能不生效,本文介紹Spring Boot 中 @Scheduled 定時(shí)任務(wù)不生效的原因及解決方法,感興趣的朋友跟隨小編一起看看吧2025-11-11
關(guān)于Java父類沒(méi)有無(wú)參構(gòu)造方法子類處理方法
父類無(wú)參構(gòu)造方法,子類不寫,其實(shí)會(huì)默認(rèn)調(diào)用父類的無(wú)參構(gòu)造方法也就是用super(),編譯運(yùn)行后,會(huì)打印出"子類會(huì)調(diào)用Father的第一個(gè)構(gòu)造方法,這篇文章給大家介紹關(guān)于Java父類沒(méi)有無(wú)參構(gòu)造方法子類處理方法,感興趣的朋友一起看看吧2024-01-01

