C#中對POP3郵件解碼
來源:互聯網
上載者:User
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。