C#中对POP3邮件解码
2024-07-21 02:20:28
供稿:网友
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:[email protected]
*********************************************
* =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。