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

一篇帶你了解 Base64 原理

開發 前端
Base64 是什么?是將字節流轉換成可打印字符、將可打印字符轉換為字節流的一種算法。Base64 使用 64 個可打印字符來表示轉換后的數據。

[[419497]]

Base64

Base64 是什么?是將字節流轉換成可打印字符、將可打印字符轉換為字節流的一種算法。Base64 使用 64 個可打印字符來表示轉換后的數據。

準確的來說,Base64 不算是一種加、解密的算法,它是一種編碼、解碼的算法。這也是為什么我的用詞是編碼、解碼,而不是加密、解密。

編碼原理

這里的討論的前提是使用 UTF-8 編碼

Base64 算法的原理,是將輸入流中的字節按每 3 個分為一組,然后每次取 6 個比特,將其轉換成表格中對應的數據,一直重復到沒有剩余的字符為止,轉換表格如下:

編碼過程

舉個例子,假設我們要對字符串 S.H 進行編碼:

  1. 將其轉換成十六進制為 53、2e、48
  2. 再將十六進制轉換成二進制,分別為 01010011、00101110、01001000。這里不足 8 個比特的高位補 0 即可。
  3. 將其每6個比特分為一組,分別為 010100、110010、111001、001000
  4. 將其轉換成十進制得到,20、50、57、8
  5. 再根據表格中的轉換關系轉換可得,U、y、5、I

換句話說,字符串 S.H 通過 Base64 算法編碼之后的結果為 Uy5I 。

編碼圖解

如果覺得文字較難理解,我把上面的流程用圖的形式畫了出來,可以結合著一起看。

為什么要 每三個 分為一組,因為 3 8 = 24,24 = 4 6,這樣子可以剛好可以均分完。

那如果我輸入的字節不足三個呢?

例如 SH ?按照上述的做法:

首先將其轉換成十六進制53、48,再將其轉換成二進制01010011、01001000,再按照每 6 個比特分為一組,就會變成 010100、110100、1000,再轉換成十進制得到 20、52、8,最后得到 U0I.

然而這個結果是不正確的,隨便去找一個工具輸入轉換看看都知道,最終結果為 U0g=. 這也說明在輸入的字符不足 3 個時,就不是按照之前的方式來處理了。

不足三個字節如何處理?

假設需要編碼的字符串還是 SH。

將其轉換成二進制為, 01010011、01001000,再按照每 6 個比特分為一組,就會變成010100、110100、1000。

但是可以看到最后一組的比特位不足 6 個,在這種情況下,會進行末尾(低位)補0的操作。補完之后就會變成010100、110100、100000。但是你會發現,這里總共也只有18個比特,不滿足 3 個字節一組的原則。在這種情況下,前三組會按照常規的 Base64 進行編碼,而缺失的一組則會使用 = 來進行填充。

這樣一來,就會變成20、52、32,再根據表格轉換可得 U0g ,再加上最后填充的 = ,最終結果就是 U0g=.

以下是圖解。

只有一個字節如何處理?

那同理,如果只有一個字符,最后在二進制分組的時候,不足 6 位的低位補 0,分組不滿 4 的,直接以 = 號填充。舉個例子,假設需要編碼的是字符串 S 。

S 的二進制為 01010011 ,按照 6 個比特分為一組,010100、11。第二組明顯不滿 6 個比特,進行低位補0操作。

低位補0之后結果變成了010100、110000,這里只有 2 組,不滿四組,所以這里需要填充 2 個 =。將前面的兩組轉換成字符,結果為 Uw,再結合填充字符,最終的結果為 Uw==。

關于編碼,有人可能會說,你這都是英文,英文轉換成十進制再到十六進制很方便,對比 ASCII 碼就行,那要是中文呢?實際上,這個跟采取的編碼類別有關系。對同樣的中文采用不同的編碼,最后得到的結果可能都不同。所以我們這里只討論采用 UTF-8 的場景。

如果是中文,就采用 UTF-8 將中文進行編碼,而如果是英文,其轉換結果和 ASCII 編碼是一樣的。

解碼原理

因為最終的編碼產物中,如果 6 個比特的分組不滿 4 組,會有 = 作為填充物,所以一個 base64 完后的產物總是能夠被 4 整除。

所以,在解密中,我們每次需要處理 4 個字符,將這 4 個字符編碼之后轉換成十進制,再轉換成二進制,不足 6 位的高位補0,然后將 6 個比特一組的二進制數按原順序重新分成每 8 個比特一組,也就是一個字節一組。然后將其轉換成十六進制,再轉換成對應的字符。

解碼過程

假設我們需要解密的字符為 Uy5I

解密過程就會像:

按照每次處理4個字符的原理,根據表格將其分別轉換成十進制20、50、57、8

再將其轉換成二進制,不足六位的高位補0,再將其分成每 8 個比特一組

將分組好的比特轉換成十六進制,得到53、2e、48

最后將十六進制轉換成字母得到S、.、H,也就是 S.H

解碼圖解

換成圖片來說就是如下這樣

這里我們處理的是一個比較理想的情況,因為所有的比特位剛好被填充完,那如果帶有 = padding 的 base64 是如何進行解密的呢?

這里拿 SH 編碼之后的 base64 字符串 U0g= 來做例子

  1. 首先根據表格,將其轉換成十進制20、50、32
  2. 再將其轉換成二進制,不足 6 個比特的高位補0,010100、110100、100000
  3. 再將其分成每 8 個比特位一組,01010011、01001000、
  4. 然后再轉換成十六進制得53、48
  5. 轉換成字符串可得 SH

 

責任編輯:姜華 來源: SH的全棧筆記
相關推薦

2019-07-23 08:55:46

Base64編碼底層

2021-08-11 07:02:21

npm包管理器工具

2022-02-18 08:54:21

docker操作系統Linux

2021-05-20 06:57:16

RabbitMQ開源消息

2021-03-05 09:10:19

base64編碼

2023-05-12 08:19:12

Netty程序框架

2021-07-28 10:02:54

建造者模式代碼

2021-07-14 08:24:23

TCPIP 通信協議

2021-06-30 00:20:12

Hangfire.NET平臺

2021-11-24 08:51:32

Node.js監聽函數

2021-08-02 06:34:55

Redis刪除策略開源

2021-11-08 08:42:44

CentOS Supervisor運維

2021-12-15 11:52:34

GPLLinuxGNU

2020-11-10 10:48:10

JavaScript屬性對象

2021-06-04 09:56:01

JavaScript 前端switch

2021-07-08 06:30:03

Linux CPULinux 系統

2021-08-14 10:01:43

Python條件語句Python基礎

2021-01-29 18:41:16

JavaScript函數語法

2021-02-02 18:39:05

JavaScript

2022-02-17 08:35:59

OLTPOLAP數據倉庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 波多野吉衣在线播放 | 热99| 97超碰在线免费 | 在线观看免费高清av | 中文久久 | 99免费精品视频 | 插插宗合网 | 亚洲日本欧美日韩高观看 | 日本超碰在线 | 久久久性| 欧美一区二| 成人欧美一区二区 | a在线观看 | 国产96色在线 | 亚洲精品久久久久久久久久吃药 | 韩日精品一区 | 国产成人一区二区三区精 | 久久九 | 人人射人人| 国产精品久久久久久久久久免费 | 欧美日韩一区二区三区四区 | 深夜爽视频 | 日韩电影中文字幕 | 爱爱视频在线观看 | 九九久久99 | 91精品国产91久久久久久最新 | 丝袜一区二区三区 | 国产成人网 | 伦理一区二区 | 欧美精品第一区 | 四虎网站在线观看 | 毛片网站在线观看 | 欧美一区二区在线 | av手机在线看 | 2019精品手机国产品在线 | 亚洲高清免费视频 | 成在线人视频免费视频 | 三级在线观看 | 日本在线一二 | 成人1区2区 | 一本大道久久a久久精二百 国产成人免费在线 |