什麼是base64?

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-hk/n/271376.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 14:55
下一篇 2024-12-16 14:55

相關推薦

發表回復

登錄後才能評論