首页 > C/C++语言 > C/C++数据结构 > uuencode编码和解码
2006
03-25

 uuencode是以前unix下常用编码方式应用于UUCP(unix to unix copy),通过串行通讯传 输二进制文件.base64属于MIME(多用途国际互联网 邮件扩展)编码,与uuencode不是同一个范畴的,MIME主要应用于邮件,Uuencode主要应用 在邮件和新闻组.
uuencode的开头是:
begin <模式> <文件名>
<数据>
end
编码算法为不断地用3个字节数据列成一组(不足3个字节以零补齐)然后 此24位数据分为4组,每组6位,再将得到的6位二进制数映射到ASCII码32~95之间的字符,而每行以M 开头(表示32+45),60个字符一行(不包括”M”),最后一行以32+N 的ASCII字符开头,N 为最后一行编码的输入字节数.编码以一个只含一个空格的一行和含”end”的一行结束.  从前一部分看和base64没有什么区别(关于base64的编码和解码请参见http://www.csdn.net/develop/read_article.asp?id=8843),都是将3个字符换成4个字符,不同的是base64由自己的base64码表,而uuencode是直接使用ascii码做码表.
eg.
begin …..
M1&%T93H(“‘@(“‘@(#0O-2′\Y-2′Y.C,S.C$P($%-#0I&<FJM .B’@(“‘@(“‘@
M2&5N<GDL($@N62X@5VJN9PT*4W5B:F5C=#H@(“‘@($%B;W5T($U) 344@96YC
M;VIE=VIE8V1E8VJD92!P<FJG<F%M#0I4;SH @(“‘@(“‘@(“‘@0VAA<FQE<R!-80T*
M;W(@8F%S938T(‘1R86YS9F5R(&9O<FUA=”P-”B’ @(“‘@(“‘@(“‘@(“UO(#QF
    相信上过网的朋友们都遇见过”乱码”,也就是在浏览网页或看Email时出现的不能辨认的字符。以前也有许多的文章介绍过”乱码”,不过他们的文章只是讲怎样辨别和怎样用工具解码,并没有详细介绍各种编码的算法的实现,本文将对互联网上最常用的几种编码的编码和解码算法作以详细的阐述。希望对想了解”乱码”算法或想在自己程序中实现这些功能朋友们有一些参考价值。本文的源程序用C语言写成,形式为函数,可直接使用。

Uuencode:
    Uuencode 是将二进制文件以文本文件方式进行编码表示、以利于基于文本传输环境中进行二进制文件的传输/交换的编码方法之一, 在邮件系统/二进制新闻组中使用频率比较高,经常用于 Attach 二进制文件。


这种编码的特征是:每一行开头用”M”标志。下面是我做的一个测试用的文件mogao.txt,编码Uuencode:
begin 644 mogao.txt
M”0D)(“`@(*&VPM+”Z\OCMZBT\\BKH;<-”@G7]]7?.FUO9V%OHZRP U]3&N\:Z
MU]6^HZAT96QN970Z+R\R,#(N,3$R+C(P+C$S,CHR,Z.IL\G4L:&C#0H )(“`@
M(“`@Q*JXW\CMO/ZYI-?WRM*CNFAT=’`Z+R]M;V=A;RYB96YT:75N+FYE=`T *
M”0D)16UA:6QT;SIM;V=A;T`S-S$N;F5T#0H)(“`@*BHJ*BHJ*BHJ*BHJ*BH J
M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ(“`@(“`@(“`@(“`@(“` @
M#0H)(“`@*B”S_<’+O,?2Y,JRP[2VO+*[M/C7WZ.LL_W!R]?CO*/*LL.TMKRR
MN\’TS\(J#0H)(“`@*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BH J
,*BHJ*BHJ*BHJ*BHJ
`
end


你可以把它单独存成一个文件:mogao.uue,然后用Winzip打开,解压即得mogao.txt。 
Uuencode的算法很简单,编码时它将3个字符顺序放入一个 24 位的缓冲区,缺字符的地方补零,然后将缓冲区截断成为 4 个部分,高位在先,每个部分 6 位,用下面的64个字符重新表示:
“`!”#$%&’()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP QRSTUVWXYZ[\]^_”
    在文件的开头有”begin xxx 被编码的文件名”,在文件的结尾有”end”,用来标志Uue文件的开始和结束。编码时,每次读取源文件的45个字符,不足45个的用”NULL”补足为3的整数倍(如:23补为24),然后输入目标文件一个ASCII为:”32+实际读取的字符数”的字符作为每一行的开始。读取的字符编码后输入目标文件,再输入一个”换行符”。如果源文件被编码完了,那么输入”`(ASCII为96)”和一个”换行符”表示编码结束。
    解码时它将4个字符分别转换为4个6位字符后,截取有用的后六位放入一个 24 位的缓冲区,即得3个二进制代码。


留下一个回复