【MIME協議】base64編碼與quoted-printable編碼

MIME概述

電子郵件協議SMTP通過連接建立郵件傳送連接釋放三個階段實現發送方和接收方之間的通信。

不過SMTP有很多的缺點:

  1. SMTP不能傳送可執行文件或其他的二進制對象。
  2. SMTP限於傳送7位的ASCLL碼很多非英語語言無法傳送。
  3. SMTP服務器會拒絕超過一定長度的郵件。
  4. 某些SMTP的實現並沒有完全按照SMTP的互聯網標準。如:

    回車、換行的刪除和增加
    超過76個字符會截斷或者自動換行
    後面多餘的空格刪除
    將製表符tab轉換爲若干個空格

提出了通用互聯網郵件擴充MIME

在這裏插入圖片描述
MIME繼續使用原來的郵件格式,增加了郵件主體的結構,定義了傳送非ASCALL碼的編碼規則。

MIME增加5個新的郵件首部

  1. MIME-Version

    表示使用的MIME的版本號,一般是1.0

  2. Content-Type

    說明郵件主體的數據類型和子類型
    Content-Type都是“主類型/子類型”的形式。主類型有text, image,audio, video, application, multipart, message等,分別表示文本、圖片、音頻、視頻、應用、分段、消息等。

  3. Content-Transfer-Encoding

    在傳送郵件主體如何編碼的
    Content-Transfer-Encoding共有Base64, Quoted-printable, 7bit, 8bit, Binary等幾種。
    使用最廣泛的編碼方式:Base64, Quoted-Printable。

  4. Content-Disposition

    可讀字符串,說明此郵件主體是否是圖像、音頻或視頻

  5. Content-ID

    郵件的唯一標識符

瞭解了MIME基本概況,我們看看兩種使用最廣泛的編碼方式。

base64編碼

對於任意的二進制文件,都可用base64編碼。base64已經成爲網絡上常見的傳輸8Bit字節代碼的編碼方式之一。

基本原理

定義一個base62索引表,有字符"A-Z、a-z、0-9、+、/" 64個可打印字符。
6位二進制代碼共有64種不同的值,從0到63,下面是對應表

0 A  17 R   34 i   51 z

1 B  18 S   35 j   52 0

2 C  19 T   36 k   53 1

3 D  20 U   37 l   54 2

4 E  21 V   38 m   55 3

5 F  22 W   39 n   56 4

6 G  23 X   40 o   57 5

7 H  24 Y   41 p   58 6

8 I  25 Z   42 q   59 7

9 J  26 a   43 r   60 8

10 K  27 b   44 s   61 9

11 L  28 c   45 t   62 +

12 M  29 d   46 u   63 /

13 N  30 e   47 v

14 O  31 f   48 w   

15 P  32 g   49 x

16 Q  33 h   50 y

具體步驟

  1. 把二進制代碼劃爲一個個24位長的單元,再把每一個24位單元劃分爲4個6位組。
  2. 在每組前面添加兩個0,每組由6個變爲8個二進制位,總共32個二進制位(四個字節)。
  3. 根據base64編碼對照表獲得對應的值。

例題

試將數據 11001100 10000001 00111000進行base64編碼,並得到最後傳輸的ASCII數據。

  • 第一步:正好是24位長,分爲4個6位組

    110011 001000 000100 111000

  • 第二步:在每組前面添加兩個0

    00110011 00001000 00000100 00111000
      51    8     4     56

  • 第三步:根據base64編碼對照表獲得對應的值。

    00110011 00001000 00000100 00111000
      51    8     4     56
      z     I     E     4

  • 第四步:找出對應的二進制值

    z -> 122 -> 01111010
    I -> 73 -> 01001001
    E -> 69 -> 01000101
    4 -> 52 -> 00110100

quoted-printable編碼

這種方法適用於所傳送的數據中只有少量的非ASCLL碼

ASCII編碼是7位編碼,一共可以組成128個不同的ASCII碼,其中可以打印的有95個(95箇中包括了空格),還有33個控制字符不可打印。

基本步驟

可以打印的ASCLL碼,不變
等號“=”和不可打印的ASCLL碼以及非ASCLL碼的數據編碼方式:

  1. 每個字節(8位)的二進制用兩個十六進制數字表示
  2. 在其前面加上一個等號“=”

例題

試將數據01001100 10011101 00111001進行quoted-printable編碼,並得出最後傳送的ASCII數據。這樣的數據用quoted-printable編碼後其編碼開銷有多大?

  1. 第一步:將二進制分爲8位一組,轉爲十六進制,超過5F不可打印(當然也可直接轉化爲十進制,超過95不可打印)

    01001100 10011101 00111001
      4C    9D    39

  2. 可打印:不用改變,不可打印:兩個十六進制數字前面加上“=”

    01001100 10011101 00111001
      4C    9D    39
      4C    =9D   39

  3. 可打印:不用改變,不可打印:將“=”和兩個十六進制數字分別轉化爲8位二進制(=:00111101)

    4C、39可以打印,9D不可以打印
    =9D:00111101 00111001 01000100

    ASCII數據:

    01001100 00111101 00111001 01000100 00111001

開銷:(5-3)/3=66.7%

ASCLL字符代碼表

圖片來自百度
在這裏插入圖片描述
參考文獻:

計算機網絡(第7版)-謝希仁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章