乱码算法大全(一)Uuencode

 

    相信上过网的朋友们都遇见过“乱码”,也就是在浏览网页或看Email时出现的不能辨认的字符。以前也有许多的文章介绍过“乱码”,不过他们的文章只是讲怎样辨别和怎样用工具解码,并没有详细介绍各种编码的算法的实现,本文将对互联网上最常用的几种编码的编码和解码算法作以详细的阐述。希望对想了解“乱码”算法或想在自己程序中实现这些功能朋友们有一些参考价值。本文的源程序用C语言写成,形式为函数,可直接使用。

Uuencode:

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

    这种编码的特征是:每一行开头用“M”标志。下面是我做的一个测试用的文件mogao.txt,编码为Uuencode

begin 644 mogao.txt

M"0D)("`@(*&VPM+"Z/OCMZBT//BKH;<-"@G7]]7?.FUO9V%OHZRPU]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*BHJ

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*BHJ

,*BHJ*BHJ*BHJ*BHJ

`

end

 

    你可以把它单独存成一个文件:mogao.uue,然后用Winzip打开,解压即得mogao.txt

    Uuencode的算法很简单,编码时它将3个字符顺序放入一个 24 位的缓冲区,缺字符的地方补零,然后将缓冲区截断成为 4 个部分,高位在先,每个部分 6 位,用下面的64个字符重新表示:

"`!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_"

在文件的开头有“begin xxx 被编码的文件名”,在文件的结尾有“end”,用来标志Uue文件的开始和结束。编码时,每次读取源文件的45个字符,不足45个的用“NULL”补足为3的整数倍(如:23补为24),然后输入目标文件一个ASCII为:“32+实际读取的字符数”的字符作为每一行的开始。读取的字符编码后输入目标文件,再输入一个“换行符”。如果源文件被编码完了,那么输入“`ASCII96)”和一个“换行符”表示编码结束。

    解码时它将4个字符分别转换为46位字符后,截取有用的后六位放入一个 24 位的缓冲区,即得3个二进制代码。

    下面我给出Uuencode编码和解码的C语言描述:

/*Uuencode编码*/

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

/* 

chasc:未编码的二进制代码

chuue:编码过的Uue代码

*/

{int i,k=2;

 unsigned char t=NULL;

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

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

  *(chuue+i)|=t;

  if(*(chuue+i)==NULL) *(chuue+i)+=96;

  else *(chuue+i)+=32;

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

  t>>=2;

  k+=2;

 }

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

 if(*(chuue+3)==NULL) *(chuue+3)+=96;

 else *(chuue+3)+=32;

}

 

/*Uuencode解码*/

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

/* 

chuue:未解码的Uue代码

chasc:解码过的二进制代码

*/

{int i,k=2;

 unsigned char t=NULL;

 if(*chuue==96) *chuue=NULL;

 else *chuue-=32;

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

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

  k+=2;

  if(*(chuue+i+1)==96) *(chuue+i+1)=NULL;

  else *(chuue+i+1)-=32;

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

  *(chasc+i)|=t;

 }

}

乱码察看器(CodeView) 版本:2.60 系统平台:Windows95/98/NT/2000 作者:董雪强 Email: smsdxq@sbell.com.cn 一、简介 乱码察看器顾名思义就是用来察看各种乱码的工具软件,目前支持MIME/BASE64, Quoted-Printable,HZ和UUCode四种形式的编码和解码,通过一些特殊的算法, 本程序还可以解开部分由于字节高位被屏蔽而形成的死乱码(使用其它方式的解 码),对于EMail中比较常见的乱码,还进行了特别的处理,可以较好的解决很 多乱码情况,另外还提供了很多附加的功能,比如单键解码功能和混合乱码识别 功能,使得使用本程序解码变得非常容易和轻松,希望这个小工具能带给你方便。 二、安装 本软件为绿色软件,无需安装,只要将得到的压缩文件解开到一个目录中即可运行。 三、使用 3种使用方法: 1、在有乱码的窗口中直接按下单键解码热键(默认为F7),如果窗口中乱码能被 识别,就会有一个窗口覆盖当前的乱码窗口,您可以直接在这个窗口中阅解码后 的内容。建议您在大多数情况下使用此方式。 2、将乱码内容通过剪贴板复制到CodeView的源窗口中,然后您可以试着试用不 同的解码方式进行解码。这种方式解码将给于您更多的选择自由,并且可以使用 一些在单键解码中无法实现的解码方式(主要是其他方式解码和UUCode解码), 对于一些单键解码无法解决的乱码可以使用此方式试试。 3、首先打开选项中监视剪贴板和智能弹出功能(默认为关闭),然后可以将 CodeView最小化,这时,只要你将任何乱码复制到剪贴板中,如果能够被识别, CodeView会自动弹出,您可以选择相应的解码方法进行解码。如果上面的1,2都 不合你的要求,可以试试这个方式。 四、功能描述 支持MIME/BASE64,Quoted-Printable,HZ和UUCode四种形式的编码和解码 改进的混合乱码识别算法(多种乱码混合在一起时可以正确识别不同乱码) 单键解码功能:只要选中需要察看的乱码文本(如果不选中任何内容,则会自动全选), 然后按下预先设定的热键(默认为F7),配合改进的识别算法,可以较好的将这些乱码 转成正常的文本,并可以很方便的阅读。 自动识别BIG5码(自动将BIG5码转成GB码) 支持某些HTML对汉字进行编码造成的乱码,并可以进行单键解码和混合乱码识别 繁体中文和简体中文互相转换(win2k下使用更方便了) 实时监视剪贴板 自动解码 智能弹出 打开保存文件和文件拖放的支持 此外,还可以更改背景颜色及默认字体及其他一些功能。 五、版本历史 ……v2.60 新增加了某些HTML对中文进行编码所形成的乱码的识别支持 修正了程序运行时Windows无法关机的问题 修正了一些小Bug ……v2.50 这个版本没有增加新的功能,但是重新编写了所有的解码编码算法,速度得到极大提高。 ……v2.24 增加了可扩充的多语言支持 改进了乱码识别算法,可以更好的识别邮件主题中的乱码 改进了其他方式的解码,更好的识别那些被屏蔽了高位的死乱码邮件 ……v2.22 增加了打开保存文件和文件拖放的支持。 修正了GB->BIG5转换的BUG,修正了HZ码转换的BUG。 ……v2.20 增加了BIG5和GB相互转换功能,并提供了在解码时自动进行BIG5->GB功能 改进了混合乱码识别 增加了单键解码功能 ……v2.00 大幅改进了操作界面 增加了混合乱码识别功能 修正了v1.x版中监视剪贴版时的BUG。 ……v1.0 第一个发布的版本,具备了很多基本的功能。 六、一些说明 首先说明的一点就是:由于乱码的多样性,我不能保证本程序能100%的解决所有的乱码,有相当 一部分乱码是根本无法解开的(最常见的无法解开的乱码形式就是有很多?号的乱码)。 由于本程序主要是用来帮助阅读文本形式的乱码,因此对于一些经过了编码的邮件附件本程序还 不提供支持,不过您可以将这些编码后的附件保存为*.uue,然后用winzip进行解码。 关于混合乱码识别: 由于乱码的多样性,导致混合乱码识别时会有一定的误判存在,表现在原本正常的一些 内容变成了乱码,这时请只复制乱码部分,而不要包含正常的文字即可。 关于智能弹出: 由于采用了混合乱码识别,导致一些正常文本复制到剪贴板时程序也会自动弹出,这时 请将其设置为不要自动弹出,可以避免一些不必要的麻烦。 有任何意见和建议请和我联系:smsdxq@sbell.com.cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值