成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解Base64編碼原理

開發 前端
Base64編碼是一種廣泛應用的編碼方法,它將二進制數據轉換為可打印的ASCII字符集,特別適用于數據傳輸和存儲場景。

前言

上篇文章有涉及到Base64編碼的內容,今天我們再來詳細了解一下Base64的編碼原理以及應用場景。

通過這篇文章你能夠學習到:

  • 什么是Base64,為什么需要Base64?
  • Base64的編碼原理
  • Base64的應用場景

什么是Base64?

Base64是一種用于傳輸8bit字節數據的編碼方式,Base64 的字符集包含 64 個字符(A-Z、a-z、0-9、+、/)以及補位的=

??需要注意的是它只是一種編碼方式,并不是加密方式!!!因為對于Base64來講,它沒有密鑰的概念,這意味著任何人都能輕松地將Base64編碼的數據還原為原始字符。

盡管如此,不少人仍誤將其當作加密工具來使用,這在具備基本技術知識的人眼中,無異于未加密處理...

為什么需要Base64編碼?

Base64編碼最初主要應用于郵件傳輸協議中,由于這些協議僅支持ASCII字符的傳遞,導致直接傳輸二進制文件(如圖片、視頻等)成為不可能。為了解決這一問題,Base64被設計出來,它能夠將二進制文件內容轉換成僅包含ASCII字符的編碼形式,從而實現在郵件傳輸協議中安全、有效地傳遞二進制數據。

編碼原理

Base64 編碼的核心原理是將輸入數據(多為二進制形式)轉換成特定字符序列。具體步驟為:首先將輸入數據分割成每三個字節(共24位)一組,接著將這24位分割為四個6位的塊(因為Base64中每個字符代表6位二進制數據)。最后,通過查找表將這些6位塊映射為相應的Base64字符。

base64字符集

上面我們提到標準的Base64一般包含64個字符再加一個補位的=

  • 大寫字母:A-Z(26 個字符)
  • 小寫字母:a-z(26 個字符)
  • 數字:0-9(10 個字符)
  • 特殊字符:+ 和 /(2 個字符)
  • 補位字符:=

編碼步驟

  1. 分組:將輸入數據按每三個字節一組進行劃分,每組組成一個24位的二進制數據塊。
  2. 分割:將每個24位的數據塊進一步分割成四個6位的數據塊。
  3. 字符映射:通過查找字符集,將每個6位數據塊映射為字符集中的對應字符。
  4. 填充處理:若輸入數據的字節數非3的倍數,則在數據末尾添加=字符作為填充,以確保編碼結果的長度符合Base64規范。

怎么理解這些步驟?

以南玖的南拼音為例

首先將字符對應的二進制位表示出來

圖片圖片

剛好nan是3個字節,它們的二進制位正好組成了一個24位的二進制塊

接著把這個二進制塊分割成4個6位的數據塊

圖片圖片

最后通過查找Base64編碼對照表,找到每個6位數據塊對應的字符

圖片圖片

最終nan編碼為bmFu

由于nan的字節數正好是3的倍數,所以它不需要補位,編碼后也就不會出現=

補位

如果字節數不是3的倍數,那么余數可能是1或2,所以補位也需要分兩種情況。

  • 余數為1,二進制末尾補4個0,最后多出來的這個字符會編碼成2個base64字符,最后再補兩個=

比如宋的拼音song,余數為1

圖片圖片

在這基礎上最后還得補上2個=,最終song編碼為c29uZw==

  • 余數為2,二進制末尾補2個0,編碼后末尾再補1個=

比如ab,余數為2

圖片圖片

最終ab編碼為YWI=

驗證

在javaScript中可以調用btoa來進行base64編碼

圖片圖片

動手實現一下Base64編解碼

base64編碼

// 自定義base64編碼
const customEncrypt = (str: string) => {
    // base64字符集
    const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
    // 將字符串轉中的每個字符轉換成8位二進制
    const binaryStr = str.split('').map(char => {
        const binary = char.charCodeAt(0).toString(2)
        return binary.padStart(8, '0')
    }).join('')

    // 將二進制字符串按6位分割
    const binaryArr = binaryStr.match(/.{1,6}/g) || []

    // 如果最后一組不是6位的倍數,后面補0
    const last = binaryArr[binaryArr.length - 1]
    if(last?.length % 6 !== 0) {
        binaryArr[binaryArr.length - 1] = last.padEnd(6, '0')
    }

    // 將6位的二進制轉換成10進制
    const decimalArr = binaryArr.map(binary =>parseInt(binary, 2))

    // 根據10進制的值獲取base64字符
    let base64Str = decimalArr.map(decimal => base64Chars[decimal]).join('')

    // 補位
    while(base64Str.length % 4 !== 0) {
        base64Str += '='
    }
    return base64Str
}

基本按照上面的編碼步驟實現即可

驗證

console.log('btoa', btoa('song'))
console.log('自定義加密', customEncrypt('song'))

圖片圖片

base64解碼

解碼的過程基本就是與編碼反過來

// 自定義base64解碼
const customDecrypt = (str: string) => {
    // base64字符集
    const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
    // 將base64字符轉換成10進制
    const decimalArr = str.split('').map(char => base64Chars.indexOf(char))

    // 將10進制轉換成6位二進制
    const binaryArr = decimalArr.map(decimal => decimal.toString(2).padStart(6, '0'))

    // 將6位的二進制拼接
    const binaryStr = binaryArr.join('')

    // 將8位的二進制轉換成字符
    const charArr = binaryStr.match(/.{1,8}/g) || []
    return charArr.map(binary =>String.fromCharCode(parseInt(binary, 2))).join('')
}

驗證

console.log('atob', atob('c29uZw=='))
console.log('自定義解碼', customDecrypt('c29uZw=='))

圖片圖片

思考??

按照這個思路我們是不是可以實現一個比Base64更安全的偽加密方法

比如:

  • 更換字符集
  • 更換二進制分割手段

應用場景

數據傳輸

Base64編碼是一種在HTTP文本協議中傳輸二進制數據的常用方法。由于HTTP協議本質上是基于文本的,它限制了只能傳輸可打印的ASCII字符(范圍從32到126),這包括字母、數字、標點符號和一些特殊符號。然而,二進制數據包含許多不在這個范圍內的字符,因此無法直接通過HTTP協議進行傳輸。Base64編碼不僅解決了在HTTP協議中傳輸二進制數據的問題,還確保了數據的完整性和可讀性。

數據存儲

Base64 編碼常用于存儲二進制數據,如數據庫中的圖像、文件等,因為它將數據轉換為可打印字符,避免了二進制數據在存儲過程中可能出現的問題。

在前端頁面實現中,為了提高加載效率,簡單圖片通常會選擇直接內嵌而非加載外部資源。然而,圖片是二進制數據,直接嵌入并不簡單。幸運的是,現代瀏覽器普遍支持Data URLs功能,該功能通過Base64編碼將圖片或其他文件的二進制數據轉換為文本字符串,從而可以方便地嵌入到網頁中。這樣,就無需進行額外的外部資源加載,有助于減少頁面加載時間。

協議編碼

Base64編碼最初主要應用于郵件傳輸協議中,由于這些協議僅支持ASCII字符的傳遞,導致直接傳輸二進制文件(如圖片、視頻等)成為不可能。為了解決這一問題,Base64被設計出來,它能夠將二進制文件內容轉換成僅包含ASCII字符的編碼形式,從而實現在郵件傳輸協議中安全、有效地傳遞二進制數據。

總結

Base64編碼是一種廣泛應用的編碼方法,它將二進制數據轉換為可打印的ASCII字符集,特別適用于數據傳輸和存儲場景。然而,重要的是要認識到,Base64編碼本身并不具備數據加密或安全保護的功能。在需要處理敏感信息時,僅憑Base64編碼是遠遠不夠的,必須結合適當的加密技術和安全傳輸協議(如HTTPS)來確保信息的安全性和隱私性。

責任編輯:武曉燕 來源: 前端南玖
相關推薦

2021-09-07 08:59:09

編碼Base64解碼

2014-02-20 10:28:28

JavaScriptBase64

2019-07-23 08:55:46

Base64編碼底層

2024-02-28 23:07:42

GolangBase64編碼

2020-08-10 18:03:54

Cache存儲器CPU

2024-04-15 00:00:00

技術Attention架構

2022-11-04 09:43:05

Java線程

2024-03-12 00:00:00

Sora技術數據

2021-03-10 10:55:51

SpringJava代碼

2022-09-05 08:39:04

kubernetesk8s

2024-11-01 08:57:07

2018-01-22 17:02:48

Python字符編碼ASCII

2021-03-05 09:10:19

base64編碼

2024-07-31 10:22:49

Go語言編碼

2020-11-04 15:35:13

Golang內存程序員

2020-03-17 08:36:22

數據庫存儲Mysql

2019-07-01 13:34:22

vue系統數據

2022-09-05 22:22:00

Stream操作對象

2023-10-13 13:30:00

MySQL鎖機制

2023-11-07 08:35:26

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区2区三区3区公司 | 国产美女永久免费无遮挡 | 中文字幕日韩在线 | 农村妇女毛片精品久久久 | 中文字幕一区二区三区四区 | 中文字幕精品一区久久久久 | 97色在线视频 | 羞羞视频在线网站观看 | 国产超碰人人爽人人做人人爱 | 精品一区二区三 | 毛片免费观看视频 | 国产一级成人 | 亚洲综合色网 | 日韩高清成人 | 亚洲国产高清高潮精品美女 | 日韩无| 日韩中文字幕在线播放 | 国产在线精品一区二区三区 | 国产亚洲精品久久久久动 | 欧美一区二区大片 | 天天爱天天操 | 鸳鸯谱在线观看高清 | 国产精品一区在线 | 国产精品久久久久久久久久免费看 | 一区二区视频在线 | 日本不卡视频在线播放 | 色综合久久天天综合网 | 亚洲人人舔人人 | 伊人伊人 | 欧美精品在线免费观看 | 欧美专区在线观看 | 欧美精品一区二区蜜桃 | 国产三级大片 | 国产精品久久久亚洲 | 久久夜视频| 亚洲人成人一区二区在线观看 | 激情五月综合 | 99久久久久久久 | 欧美一区二区三区国产 | 欧美成人a∨高清免费观看 91伊人 | 99re视频在线观看 |