Base64是一種可以將任意二進位數據編碼成可列印字元的編碼方式。這種編碼方式可在HTTP等系統下使用,並且在傳輸過程中能夠保證數據的完整性。
一、base64的歷史
在早期的電子郵件系統中,只支持ASCII字符集,無法傳輸二進位數據。因此,將二進位數據轉換為ASCII字符集字元的編碼方式成為了當時的需求。
Base64編碼方式正是在這種背景下出現的。它最早在RFC 3548文檔中被定義,然後在RFC 4648文檔中被標準化,至今仍然被廣泛使用。
Base64編碼方式使用了64個可列印的ASCII字元來進行編碼,使用一組固定的字元對每3個位元組的數據進行編碼,得到4個字元。這種編碼方式不存在位元組順序問題,可以跨平台、跨語言地使用。
二、base64的編碼方式
Base64編碼方式使用了64個可列印的ASCII字元來進行編碼,包括大寫字母、小寫字母、數字和”+”、”/”兩個符號,共64個字元。編碼的基本思路是將3個位元組的數據編碼成4個字元。如下圖所示:
+--------+--------+--------+ |AAAAAABB|BBBBCCCC|CCDDDDDD| +--------+--------+--------+ +--------+--------+--------+--------+ |ABCDEFGH|IJKLMNOP|QRSTUVWX|YZabcdef| +--------+--------+--------+--------+
這裡將每個6位二進位數作為一個索引,以此索引一個固定的64個字元的表格。這個表格是由可列印的ASCII字元構成的,因此可以在各種網路和電子郵件系統中傳輸。
每個字元使用8位二進位數表示,因此每3個位元組的數據編碼成4個字元後,總大小會增加1/3。例如,3位元組的數據用Base64編碼後,會變成4個字元的數據。
三、base64的應用場景
Base64編碼方式雖然增加了數據傳輸的大小,但是可以在不改變數據內容的基礎上,將二進位數據轉換為可列印字符集,從而在郵件等協議中傳輸。在開發中,以下是幾個常見的應用場景:
1. 在HTTP請求中傳輸二進位數據
在HTTP請求中,只支持文本格式,因此不能直接傳輸二進位數據。這時可以使用Base64編碼方式將二進位數據轉換為可列印的ASCII字符集,然後在HTTP請求中傳輸。
POST /api/upload HTTP/1.1
Content-Type: application/json
{
"data": "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
}
2. 在數據存儲中使用base64編碼
在某些情況下,數據的存儲格式要求使用文本格式。此時可以使用Base64編碼方式進行編碼,然後存儲在資料庫中。例如,將圖片等二進位數據存儲到資料庫中。
CREATE TABLE user (
id INT PRIMARY KEY,
avatar TEXT
);
INSERT INTO user VALUES (1, 'data:image/jpeg;base64,/9j/4AAQSk...');
3. 數字簽名
數字簽名是指對數據進行加密處理,從而驗證數據來源和完整性。來自於其他計算機或者網路的數據在收到之後,需要進行驗證。數字簽名通常將原始數據進行Hash計算得到信息摘要,然後使用Base64編碼方式,對信息摘要進行編碼並傳輸。接收方收到數據後,可以驗證數據的完整性是否發生變化。
const crypto = require('crypto');
const data = 'Hello World!';
const secret = 'my_secret_key';
const sha1 = crypto.createHmac('sha1', secret).update(data).digest();
const signature = sha1.toString('base64');
// 發送數據
// http.post('/api/data', { data, signature });
四、base64的實現
在現代編程語言中,Base64編碼方式通常都有相應的實現方式。以下是在JavaScript中進行Base64編碼的實現過程:
// Base64編碼表格
const BASE64_TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
// 對數據進行Base64編碼
function base64Encode(data) {
let result = '';
let i = 0;
while (i < data.length) {
// 取3個位元組
const byte1 = i < data.length ? data.charCodeAt(i++) : 0;
const byte2 = i < data.length ? data.charCodeAt(i++) : 0;
const byte3 = i < data.length ? data.charCodeAt(i++) : 0;
// 拼接24位二進位數
const code = (byte1 << 16) | (byte2 <> 18;
const char2 = (code >> 12) & 0x3f;
const char3 = (code >> 6) & 0x3f;
const char4 = code & 0x3f;
// 根據索引獲取Base64字元
result += BASE64_TABLE.charAt(char1) + BASE64_TABLE.charAt(char2) + BASE64_TABLE.charAt(char3) + BASE64_TABLE.charAt(char4);
}
// 補齊
if (data.length % 3 === 1) {
result = result.slice(0, -2) + '==';
} else if (data.length % 3 === 2) {
result = result.slice(0, -1) + '=';
}
return result;
}
以上是在JavaScript中進行Base64編碼的實現過程,其他語言的實現方式也大同小異。當然,大多數現代編程語言都已經內置了Base64的相關處理方法,可以直接調用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/271376.html
微信掃一掃
支付寶掃一掃