2007年2月1日星期四

base64编码

老文重贴, 纪念我的大学时代

※編碼&解碼

編碼的種類很多, 不同作業系統也有不同的編碼種類, 常見的編
碼大都是UUencode, MIME ,QP. 所以只要弄清楚這三項就足可應
付了.
一般會用到編碼也有許多原因, 不過常見的, 例如要寄封中文信
給國外的親友, 或者是為了在信件夾檔. 因為網路上信件的傳遞
是以文字檔的方式傳遞, 如同你在FTP 抓檔, 要下傳壓縮檔, 執
行檔必須設為Binary Mode , 要下傳文字檔則須設為Ascii Mode
如設錯了, 那抓回來的檔可能就不能用了. 因此信件既然只能用
文字的形式, 如果你需要在信件中夾帶執行檔, 壓縮檔, 圖片,
等等不是文字形式的檔案時, 那就必須先將這些檔案編碼成文字
的形式, 然後才能以信件寄出, 而對方接到後則必需將它解碼還
原成原來的檔案型態. 因此就必須用到編碼&解碼.

前面提及寄中文信給國外的親友也需用到編碼. 因為國外郵件主
機大都只接受7 位元的文字, 而中文卻是8 位元, 所以也需將該
信件先另外以文書軟體打好, 然後用UUencode或MIME編碼再以夾
檔方式寄出. 有一些郵件軟體則可直接設定將信件內容以QP編碼
成7 位元的文字( 不需另行以文書軟體編寫, 在信件軟體內編寫
好以後, 寄出時就自動QP編碼了 ), 例如Eudora就有此設定項.
當然對方接到後仍然需要經過還原手續才能看到中文字. 在此一
提的. 因為Eudora有將信件QP編碼的選項( 內定 )所以如果你寄
出的中文信只是在台灣, 香港. 因為這兩地的郵件主機大都已設
定可接受8 位元的中文字, 所以無須用到QP編碼, 如果你選用QP
編碼, 反而造成收信後還必須還原才能看到中文字, 徒增麻煩,
所以如果你寄中文信的對象只在這兩地, 可以將該信件軟體設定
不使用QP編碼, 以Eudora為例, 在設定項 Sending Mail 可以將
May Use Quoted-Printable不要打勾, 這樣就可以關掉QP編碼.

※編碼

一般所使用的郵件軟體, 例如Eudora, 飛馬, MSIE的News&Mail
Netscape甚至於一些讀News的軟體Agent, VA, Gravity, 如果要
寄出編碼信, 簡單的找找各軟體的Attach File 或 Attachments
選項就可夾檔寄信了( 當然需先選擇編碼是要用UUencode或MIME
, 各該軟體都有設定項可以做設定 ). 不過如果所使用的的軟體
沒有Attach選項, 或者是在BBS 寫信, 如需夾檔就要必要先自行
編碼了.

Winzip 編碼:
啟動Winzip->選Open->選要編碼的檔案->Action 選UUencode.
例如要編碼的檔案是test.zip經編碼後會產生一個test.uue檔,
這是純文字檔, 可以用任何文書軟體來開啟, 然後標示全部內容
COPY後再貼到信件內作為信件的內容來寄出.

Wincode 編碼:
啟動Wincode ->File->Encode->Code Type ->你可以選擇常用的
UUE 或 BASE64 ->選擇檔案
同樣的, 經編碼後會產生一個.uue (UUencode) 或.b64 (MIME)
的編碼檔.

解碼

一般我們使用的信件軟體, 或讀News的軟體, 大都附有將編碼信
解碼還原的功能, 例如前面已提及的Agent, Eudora, Netscape
..etc.都有自動解碼的功能( 會自動判斷編碼形式 ), 當然不是
百無一失, 編碼的形式太多了. 而且如果你用的是BBS 的信箱,
因為會忽略一些信件的訊息, 也會造成無法自動解碼. 所以還是
需要自己手動來解碼, 另外Eudora Lite 版也無自動將UUencode
編碼信還原的功能(Lite 版只支援MIME, BinHex, Eudora Pro
版才有支援 UUdecode ).

先確定原來的檔是用什麼方式編碼, 才能對症下藥, 使用正確的
方式的解碼.

● QP
以下是QP編碼的形式:
=A7=EC=A4F=20Quick=20View=20Plus=20=B3o=AEM=AC=DD=B9=CF=
B3n=C5=E9=A4U=A8=D3=,=A6w=B8=CB=AE=C9=ABo=A5X=B2{=ADn=A7
=DA=B5=F9=A5U=AA=BA=B5e=AD=B1.
解碼方法:
因為找不到在Windows 中使用的工具, 所以只提供cvnt_qp 這個
在Dos 下工具.
首先將該信件以Save As 存成文件檔, 例如test.txt.
啟動Dos 視窗執行cvnt_qp.exe
**********************************************
* *
* Copyright by : Lin Jyun-Naih *
* *
**********************************************

(1) 8 bits character -> Quoted Printable
(2) Quoted Printable -> 8 bits character
(0) Exit
Choose: 2 (註: (1)是將信件QP編碼 (2)是還原)


input file : test.txt ( 註: 輸入要還原的檔 )
output file : test.new( 註: 指定還原後的檔名, 隨便命名 )
Transfer successfully!

(1) 8 bits character -> Quoted Printable
(2) Quoted Printable -> 8 bits character
(0) Exit
Choose: 0 (註; 輸入 0 結束)

● UUdecode
以下是UUencode 編碼的形式:
begin 644 pc_l132a.zip
M4$L#!!0````(````?B&8_Q.2M@```#H!```+````9FEL95]I9"YD:7IEC<$* M@D`41?>"_W!W[9*4!-?B0A(31PH2%Y,(1F$11O1=?D`M^HF:@?F5QM'$Z*S>
.
.
end
也就是最前頭有begin 最後是 end , 這種形式的檔就是UUencode
編碼的.

● MIME
以下是MIME編碼的形式:
Message-ID:
MIME-Version: 1.0
Content-Description: "Base64 encode of pc_l132a.zip by Wincode 2.7.3"
Content-Type: application/zip; name="pc_l132a.zip"
Content-Transfer-Encoding: Base64
Content-Disposition: attachment; filename="pc_l132a.zip"

UEsDBBQAAAAIAAAAfiGY/xOStgAAADoBAAALAAAAZmlsZV9pZC5kaXplj
cEKgkAURfeC/3B37ZKUBNfiQhITRwoSF5MIRmERRvRdfkAt+omagfmVxt
..

這種編碼很容易判斷, 可以看到
Content-Transfer-Encoding: Base64
這就是MIME編碼的一種. 如果你用Netscape的Mail來夾檔, 可能
連這些檔頭都沒有, 只有那些看似無意義的編碼, 不過還是可以
以MIME來解碼的.

以上的UUencode及MIME編碼都可以用Winzip或Wincode 來解碼.

Winzip 解碼:
如果是UUencode編碼的, 就將該信件存成文字檔, 但副檔名需指
定為.UUE或.UU , 以MIME編碼的就指定副檔名為.B64, 然後啟動
Winzip->OPEN讀入這個檔就可解碼了, 以上面的檔為例, 你將會
看到Winzip已將編碼檔還原成pc_l132a.zip, 就可以使用Winzip
的Actions->Extract把這個檔解到目錄下, 就得到pc_l132a.zip
的檔, 原來的.UUE或.B64就可以刪掉了, 當然要解開這個.zip檔
仍然可以使用Winzip, 解壓縮檔本來就是Winzip主要的功能.

Wincode 解碼:
使用Wincode 來解碼, 先將信件存檔的步驟, 跟Winzip是一樣的
( 副檔名沒有嚴格要求一定用.UUE .UU .B64 用.TXT也可)
啟動Wincode ->File->Decode->Code Type 依據檔案編碼的形式
選UUE 或BASE64->讀入先前存下的編碼檔. 這樣就可以了.
需注意的如果你要指定還原後的檔要放在何處, 在 Options->
Configuration 按畫面最底下的Decode就可以針對Decode來作設
定, 在Decoded File Directory->Set 來指定存放的目錄.
另為如果確定編碼檔是MIME編碼, 卻無法解開. 可以在Decode->
Code Type ->Base64有兩個選項, 一個是MIME 1.0 另一個是
Raw Base64, 可以指定為Raw Base64試試.

一般編碼檔為避免一封信件所夾的檔太大, 遭郵件主機拒收, 所
以常會將一個檔分成好幾封信寄出, 所以收到的編碼檔就常看到
標題欄有(0/6),(1/6),(2/6)...這樣的標示. 一般所使用的郵件
軟體大都有自動整合還原的功能, 如果沒有, 那只有用最笨的方
法, 開啟文書編輯軟體, 將編碼信去除不必要的部分, 依序組合
成一個檔以後才進行解碼.

没有评论: