日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机编码规则之:Base64编码

發布時間:2024/2/28 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机编码规则之:Base64编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • Base64和它的編碼原理
  • Base64的變體
  • Base64的編碼細節
  • 總結

簡介

我們知道計算機中的文件可以分為兩種,一種是人肉眼可讀的文本類文件,一種是肉眼不可讀的二進制文件。一般來說二進制文件如果用文本編輯器打開的話會顯示亂碼,并且二進制文件和文本文件的存儲和傳輸方式是不一樣的,那么有沒有什么辦法將二進制文件轉換成為文本文件進行傳輸或者存儲呢?答案是肯定的。

這種編碼方式就是我們今天要講到的Base64編碼。

Base64和它的編碼原理

Base64是一種將二進制編碼格式轉換為text編碼的一種形式。我們知道二進制編碼是0和1的形式,它的單位通常是一個字節,也就是8bits,每個bit表示的是0或者1。

而文本編碼的格式有很多種,最早也就是最簡單的編碼格式就是ASCII編碼,ASCII編碼的全稱是American Standard Code for Information Interchange,也就是美國信息交換標準代碼,它主要表示的是常用的一些西歐字符。

ASCII的編碼范圍是0x00-0x7F,用十進制來表示就是0-127,總共128個字符,剛好是7bits表示的范圍。

ASCII編碼中包含了33個控制字符和95個可打印的字符,如下所示:

ASCII碼含義ASCII碼含義
16進制10進制2進制16進制10進制2進制
0x0000NUL 空0x40641000000@
0x0111SOH 標題開始0x41651000001A
0x02210STX 正文開始0x42661000010B
0x03311ETX 正文結束0x43671000011C
0x044100EOT 傳輸結束0x44681000100D
0x055101ENQ 詢問字符0x45691000101E
0x066110ACK 承認0x46701000110F
0x077111BEL 報警0x47711000111G
0x0881000BS 退一格0x48721001000H
0x0991001HT 橫向制表0x49731001001I
0x0A101010LF 換行0x4A741001010J
0x0B111011VT 垂直制表0x4B751001011K
0x0C121100FF 走紙控制0x4C761001100L
0x0D131101CR 回車0x4D771001101M
0x0E141110SO 移位輸出0x4E781001110N
0x0F151111SI 移位輸入0x4F791001111O
0x101610000DLE 數據鏈路轉義0x50801010000P
0x111710001DC1 設備控制10x51811010001Q
0x121810010DC2 設備控制20x52821010010R
0x131910011DC3 設備控制30x53831010011S
0x142010100DC4 設備控制40x54841010100T
0x152110101NAK 否定0x55851010101U
0x162210110SYN 空轉同步0x56861010110V
0x172310111ETB 信息組傳送結束0x57871010111W
0x182411000CAN 作廢0x58881011000X
0x192511001EM 紙盡0x59891011001Y
0x1A2611010SUB 換置0x5A901011010Z
0x1B2711011ESC 換碼0x5B911011011[
0x1C2811100FS 文字分隔符0x5C921011100\
0x1D2911101GS 組分隔符0x5D931011101]
0x1E3011110RS 記錄分隔符0x5E941011110^
0x1F3111111US 單元分隔符0x5F951011111_
0x2032100000(space)0x60961100000`
0x21331000010x61971100001a
0x22341000100x62981100010b
0x2335100011#0x63991100011c
0x2436100100$0x641001100100d
0x2537100101%0x651011100101e
0x2638100110&0x661021100110f
0x27391001110x671031100111g
0x2840101000(0x681041101000h
0x2941101001)0x691051101001i
0x2A42101010*0x6A1061101010j
0x2B43101011+0x6B1071101011k
0x2C44101100,0x6C1081101100l
0x2D45101101-0x6D1091101101m
0x2E46101110.0x6E1101101110n
0x2F47101111/0x6F1111101111o
0x304811000000x701121110000p
0x314911000110x711131110001q
0x325011001020x721141110010r
0x335111001130x731151110011s
0x345211010040x741161110100t
0x355311010150x751171110101u
365411011060x761181110110v
0x375511011170x771191110111w
0x385611100080x781201111000x
0x395711100190x791211111001y
0x3A58111010:0x7A1221111010z
0x3B59111011;0x7B1231111011{
0x3C60111100<0x7C1241111100|
0x3D61111101=0x7D1251111101}
0x3E62111110>0x7E1261111110~
0x3F63111111?0x7F1271111111DEL 刪除

Base64就是從ASCII編碼中挑選出64個字符和二進制一個字節8bits進行映射,這也就是Base64中64的含義。為什么要選擇ASCII編碼呢?這是因為ASCII編碼是最早出現的編碼形式,幾乎所有的計算機應用都對其完全支持,不會出現數據傳輸過程中的內容轉換,非常的安全。

當然Base64編碼也有多種編碼形式,比如在MIME中,Base64選擇的是A-Z, a-z, 和 0-9 總共62個字符,再加上其他自選的兩個字符組成了64個編碼字符。

64個字符用二進制表示是6bits,而常用的二進制使用一個字節來表示,也就是8bits,那么問題來了,怎么將8bits的二進制用6bits的Base64字符來表示呢?

很簡單,我們只需要將3個8bits連接起來,變成24bits,這樣就可以用4個Base64來表示了。

為什么必須對二進制進行轉換呢?這是因為互聯網中的某些傳輸協議只支持某些特定的字符集,如果是其他的字符集是不支持的。比如說常用的發送電子郵件的附件。因為SMTP協議最開始設計的時候是支持7 位 ASCII 字符,所以如果要傳輸文件的話,我們需要對文件進行編碼之后再進行傳輸。

另外Base64的一種用法就是在HTML中將圖片嵌入到網頁中,從而實現圖片的展示。

雖然Base64很好用,但是因為其只能使用6bits的字符映射集,所以會造成數據映射的損失,從而導致二進制文件編碼過后文件體積變大的缺點。

Base64的變體

Base64簡單點說就是bit到bit之間的映射,那么肯定不止一種映射方式,我們來看下Base64編碼方式的各種變體,通常來說前62位基本上是一樣的,不同之處在后面兩個字符,以及用于填充的字符(這在某些協議中可能是強制性的,或者在其他協議中可能被刪除)。

下表是常見的Base64編碼的變體:

編碼名稱編碼字符編碼字符編碼字符
第62位第63位補全符
RFC 1421: Base64 for Privacy-Enhanced Mail (deprecated)+/= mandatory
RFC 2045: Base64 transfer encoding for MIME+/= mandatory
RFC 2152: Base64 for UTF-7+/No
RFC 3501: Base64 encoding for IMAP mailbox names+,No
RFC 4648: base64 (standard)+/= optional
RFC 4648: base64url (URL- and filename-safe standard)-_= optional
RFC 4880: Radix-64 for OpenPGP+/= mandatory

Base64的編碼細節

上一節我們講到了Base64編碼的基本原則和一些常見的變體,那么到底是如何進行映射的呢?

本節我們會以Base64的標準形式RFC 4648為例來進行詳細的講解。

RFC 4648選擇+和/這兩個字符作為編碼中的第62位和63位,并且選擇=作為補全字符。

首先來觀察一下RFC 4648的映射表:

索引二進制字符索引二進制Char索引二進制Char索引二進制Char
0000000A16010000Q32100000g48110000w
1000001B17010001R33100001h49110001x
2000010C18010010S34100010i50110010y
3000011D19010011T35100011j51110011z
4000100E20010100U36100100k521101000
5000101F21010101V37100101l531101011
6000110G22010110W38100110m541101102
7000111H23010111X39100111n551101113
8001000I24011000Y40101000o561110004
9001001J25011001Z41101001p571110015
10001010K26011010a42101010q581110106
11001011L27011011b43101011r591110117
12001100M28011100c44101100s601111008
13001101N29011101d45101101t611111019
14001110O30011110e46101110u62111110+
15001111P31011111f47101111v63111111/
補全符=

我們來以單詞man為例,來觀察一下Base64的編碼流程。

man這個單詞在ASCII中分別用77, 97和110表示,轉換成為二進制就是01001101, 01100001 和 01101110。

將上面的三個二進制合并在一起就成了:010011010110000101101110, 總共24-bit,從上面的表中選擇出對應的字符,所以我們可以得到man經過base64編碼之后得到:TWFu。

上面的例子中,man剛好是3個字符,也就是24個bits,可以用base64完整的表示。如果我們只有ma這兩個字符,應該怎么進行編碼呢?

和上面一樣,ma的二進制分別是01001101, 01100001,合并起來就是0100110101100001。

但是上面的bits只有16位,因為一個base64是6bits,所以可以用3個base64來表示,因為原始的bits少了兩位,所以用0來補全:

0100110101100001+00 = 010011010110000100。

010011010110000100轉換成為base64就是TWE,因為base64編碼需要4個字符,所以最后的字符用=來補全,也就是說me經過base64之后變成TWE=。

總結

以上就是Base64的基本含義和轉換規則,其實協議很簡單,將要轉換的數據變成二進制,然后對照轉換表格進行轉換和補全即可。

本文已收錄于 http://www.flydean.com/18-base64-encoding/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!

總結

以上是生活随笔為你收集整理的计算机编码规则之:Base64编码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。