C#中對POP3郵件解碼

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Base64和下面將要介紹的Quoted-Printable都屬於MIME

(多部分( multi-part)、多媒體電子郵件和 WWW 超文本的

一種編碼標準,用於傳送諸如圖形、聲音和傳真等非文本數

據)。MIME定義在RFC1341中。

Base64是現今在互聯網上應用最多的一種編碼,幾乎所

有的電子郵件軟件頭把它作為默認的二進制編碼,它已經成

了現今電子郵件編碼的代名詞。

下面是Base64的一個例子,從例子中,您也可以看到

Base64與電子郵件的的緊密聯系:

Content-Type: text/plain;charset="cn-gb"

Content-Transfer-Encoding: BASE64

CQkJICAgIKG2wtLC68vjt6i088irobcNCgnX99XfOm1vZ2Fvo6yw19TGu8a619W+o6h0ZWxuZXQ6

Ly8yMDIuMTEyLjIwLjEzMjoyM6Ops8nUsaGjDQoJICAgICAgxKq438jtvP65pNf3ytKjumh0dHA6

Ly9tb2dhby5iZW50aXVuLm5ldA0KCQkJRW1haWx0bzptb2dhb0AzNzEubmV0DQoJICAgKioqKioq

KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgDQoJ

ICAgKiCz/cHLvMfS5Mqyw7S2vLK7tPjX36Oss/3By9fjvKPKssO0tryyu8H0z8IqDQoJICAgKioq

KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq

你可以把它單獨存成一個文件,可以取名為:mogao.eml,

雙擊可以用OutLook打開(前兩行為郵件的原始信息,從第四行

開始為編碼內容)。

Base64的算法同Uuencode的算法很接近,也很簡單:它將

字符流順序放入一個 24 位的緩衝區,缺字符的地方補零。然

後將緩衝區截斷成為 4 個部分,高位在先,每個部分 6 位,

用下面的64個字符重新表示:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv

wxyz0123456789+/"。

如果輸入只有一個或兩個字節,那麽輸出將用等號"="補足。

這可以隔斷附加的信息造成編碼的混亂。它每行一般為76個字符。

下面我給出Base64的編碼和解碼的C語言描述:

/*Base64編碼*/

void Base64(unsigned char chasc[3],unsigned char chuue[4])

/*

chasc:未編碼的二進制代碼

chuue:編碼過的Base64代碼

*/

{

int i,k=2;

unsinged char t=NULL;

for(i=0;i<3;i++)

{

*(chuue+i)=*(chasc+i)>>k;

*(chuue+i)|=t;

t=*(chasc+i)<<(8-k);

t>>=2;

k+=2;

}

*(chuue+3)=*(chasc+2)&63;

for(i=0;i<4;i++)

if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65;

else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71;

else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4;

else if(*(chuue+i)==62) *(chuue+i)=43;

else if(*(chuue+i)==63) *(chuue+i)=47;

}

/*Base64解碼*/

void unBase64(unsigned char chuue[4],unsigned char chasc[3])

/*

chuue:未解碼的Base64代碼

chasc:解碼過的二進制代碼

*/

{int i,k=2;

unsigned char t=NULL;

for(i=0;i<4;i++)

if((*(chuue+i)>=65)&&(*(chuue+i)<=90)) *(chuue+i)-=65;

else if((*(chuue+i)>=97)&&(*(chuue+i)<=122)) *(chuue+i)-=71;

else if((*(chuue+i)>=48)&&(*(chuue+i)<=57)) *(chuue+i)+=4;

else if(*(chuue+i)==43) *(chuue+i)=62;

else if(*(chuue+i)==47) *(chuue+i)=63;

else if(*(chuue+i)==61) *(chuue+i)=0;

for(i=0;i<3;i++)

{*(chhex+i)=*(chuue+i)<<k;

k+=2;

t=*(chuue+i+1)>>8-k;

*(chhex+i)|=t;

}

}

4. Quoted-Printable

Quoted-Printable簡稱QP, 一般用在Email系統中。它

通常用於少量文本方式的8位字符的編碼,例如Foxmail就用

它做對主題和信體的編碼。這種編碼的應該是很好辨認的:

它有大量的"="。下面是它的一個例子:

Mime-Version: 1.0

Content-Transfer-Encoding: quoted-printable

=A1=B6=C2=D2=C2=EB=CB=E3=B7=A8=B4=F3=C8=AB=A1=B7

=D7=F7=D5=DF:mogao=A3=AC=B0=D7=D4=C6=BB=C6=BA=D7=D5=BE=A3=A8telnet://202.11

2.20.132:23=A3=A9=B3=C9=D4=B1=A1=A3

=C4=AA=B8=DF=C8=ED=BC=FE=B9=A4=D7=F7=CA=D2=A3=BAhttp://mogao.bentiun.

net

Emailto:mogao@371.net

*********************************************

* =B3=FD=C1=CB=BC=C7=D2=E4=CA=B2=C3=B4=B6=BC=B2=BB=B4=F8=D7=DF=A3=AC=B3=

FD=C1=CB=D7=E3=BC=A3=CA=B2=C3=B4=B6=BC=B2=BB=C1=F4=CF=C2*

*********************************************

你可以把它單獨存成一個文件,取名為:mogao.eml,

雙擊可以用OutLook打開(前兩行為郵件的原始信息,從第

四行開始為編碼內容)。

QP的算法可以說是最簡單的也可以說是編碼效率最低的

(它的編碼率是1:3),它是專門為了處理8位字符制定的。

它的算法是:讀一個字符,如果ASCII碼大於127,即字符的

第8位是1的話,進行編碼,否則忽略(有時也對7位字符編碼)。

編碼很簡單,看下面的C語言描述即可:

/*QP編碼*/

void qp(unsigned char sour,unsigned char first,unsigned char second)

/*

sour:要編碼的字符

first:編碼後的第一個字符

second:編碼後的第二個字符

first和second為返回值

*/

{

if(sour>127)

{first=sour>>4;

second=sour&15;

if(first>9) first+=55;

else first+=48;

if(second>9) second+=55;

else second+=48;

printf("%c%c%c",'=',first,second);

}

}

/*QP解碼*/

void uqp(unsigned char sour,unsigned char first,unsigned char second)

/*

sour:解碼後的字符

first:QP碼的第一個字符

second:QP碼的第二個字符

sour為返回值

*/

{

if(first>=65) first-=55;

else first-=48;

if(second>=65) second-=55;

else second-=48;

sour=NULL;

sour=first<<4;

sour|=second;

}

現在大家知道為什麽QP的編碼率那麽低了吧!關於QP的

詳細說明和準確定義可以參閱RFC2045。

 
 
 
免責聲明:本文為網絡用戶發布,其觀點僅代表作者個人觀點,與本站無關,本站僅提供信息存儲服務。文中陳述內容未經本站證實,其真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
© 2005- 王朝網路 版權所有 導航