实验目的
1.理解交换码的作用,了解与熟悉互联网上常用的交换码。
2.理解Base64、HZ的编码与解码规则以及算法。
3.掌握Base64、HZ编码与解码的算法并通过程序实现编码与解码功能。
实验内容
1.编写程序熟悉C/C++语言的位运算。
2.设计Base64编码、解码的算法。
3.编写一个基于GBK的Base64编码和解码器,实现GBK内码和Base64编码的文件级转换。
预备知识
一、机内码与交换码
GB2312—80、GBK、Big-5、Unicode等标准与规范有效地解决了汉字在计算机内表示与存储的问题,但是在互联网发展早期,互联网上设备与软件主要传递的是ASCII字符,尤其是E-mail只能传递ASCII字符。众所周之,ASCII字符的最高位通常是0,而汉字机内码每个字节最高位往往可能是1,这样直接导致汉字在网络上传输时可能发生不可预料的结果(例如,这些字节的最高位可能被强行置成0,也有可能被认为是错误的数据而丢弃)。实质上,在互联网上传递二进制文件时,同样也会遇到最高字节可能为1的问题,所以适用于互联网的交换码应运而生。
交换码的主要思想是在数据通过网络传输之前对之进行编码,使之符合网络传递要求,在接收到编码过的数据后对之进行解码,从而恢复数据。根据其中编码的方式不同,互联网上常见的交换码有:UUENCODE编码、Quoted-Printable编码、Base64编码、HZ编码、UTF-7编码、UTF-8编码等。其中Base64编码、UTF-7编码和UTF-8编码目前被广泛使用。
二、Base64编码
Base64属于MIME(Multipurpose Internet Mail Extensions,多功能Internet邮件扩充服务),它是被多媒体电子邮件和WWW超文本广泛使用的一种编码标准,用于传送诸如图形、声音和传真等非文本数据。在RFC1341中详细定义了MIME。Base64是现今互联网上应用最多的一种编码,大多数的电子邮件软件都把它作为默认的二进制数编码方法,它几乎已经成了现今电子邮件编码的代名词。
下面是一个MIME中使用Base64的例子:
MIME-Version:1.0
Content-Type:text/plain;
charset="gb2312"
Content-Transfer-Encoding:base64
X-MSMail-Priority:Normal
X-Mime OLE:Produced By Microsoft MimeOLEV5.00.2615.200
zt K5+r K7vfb Kx8r Avef Jz9fut PO1x Muutb7J+r L6ufq6zc/7t9G5+q Osu Pz Kx7W+1/f A+sq31+7T xr7Doa LLrr W+0s W0q9f K1LTX7rfhu Lu1x Ln6v NLWrt K7oa O/v Ln F1q TD96Os1Of U2jcw MDC24MTq x7Cjr M7Sufq+zb+qyrz W1tayy661vq Gj DQo=
·Base64编码算法
Base64编码的方法是:将输入数据流每次取6bit,用此6bit的值(0~63)作为索引去查Base64编码对照表,然后输出相应字符。这样,每3个字节被编码为4个字符(3×8=4×6),当编码的结果出现最后不满4个字符的情况时用“=”填充。这可以避免后面附加的信息造成编码的混乱,而且便于解码,因此编码后的字符串长度一定是4的倍数。由于可能补充“=”,Base64编码后的结果字符串中实际上最多有65种符号。
Base64编码具体过程是这样的:第一个字符通过右移2位得到高6位,获得第一个目标字符在Base64编码表中的位置,根据这个位置取到表3.1上相应的字符,就得到第一个目标字符;然后将第一个字符左移6位拼上第二个字符右移4位的结果,即获得第二个目标字符的位置;再将第二个字符左移4位拼上第三个字符右移6位结果,获得第三个目标字符位置;最后取第三个字符的右6位即获得第四个目标字符位置。
表3.1 Base64编码对照表
图3.1显示了对“AB1”这个字符串进行Base64编码的详细过程,为了便于查看,其中每个字节分别以十六进制和十进制进行了显示。
图3.1 “AB1”Base64过程
三、HZ编号
HZ码也是为了使只能传送7位信息的邮件服务器或网关能传送8位信息而设计的编码,它是一种常用的中文交换码。但它和前面提及的Quoted-Printable码都只能对文本进行编码,也就是说编码时会忽略控制字符。这种编码往往比较容易辨认:通常有许多“~{”和“~}”,而且总是成对出现。
以下是一个采用HZ编码电子邮件的例子:
MIME-Version:1.0
Content-Type:text/plain;
charset="hz-gb-2312"
Content-Transfer-Encoding:quoted-printable
X-Priority:3
X-MSMail-Priority:Normal
X-Unsent:1
X-Mime OLE:Produced By Microsoft MimeOLE V5.00.2615.200
~{!!!!Am Mb#,SISZ~}2002~{Dj~}7~{TB~}AOL~{1;FX9b4f TZWv<YUJ5DNJLb#,~}8~{TB~}=
14~{HU8C9+K>R23PHO#:!0TZ;a<F4&@m7=3DCf#,H7J54f TZ2;?IPE5D5X7=3D!1!#8C9+K>1=
m J>#,!0If OS5D;a<FR5Nq JGTZ9}H%~}1~{Dj0k FZ<d7"Iz5D#,2;9}If<05D=3D;RW=3Dp6n=3D=
v SP~}4900~{Mr C@T*!1!#!0D?G0RQ>-?*J<U9?*9+K>DZ2?5w2i#,=3Dq:s;9=3D+6TFd K|=3D=
;RW=3Dx PP5w2i!#<F;.TZ5Z~}3~{<>6HD)G0=3Da Jx5w2i!1!#~}
·HZ编码算法
HZ编码只对最高位为1的字符(例如,GB2312—80汉字的机内码)进行编码,具体编码方法是将最高位置0,只保留低7位,并将经过变换后的部分字符用“~{”和“~}”括起来,解码的时候只需将“~{”和“~}”括起来的部分每个字符的最高位置为1就可以正确地还原了。显然,如果在编码的时候遇到中西文交替出现的文本,编码将会出现“抖动”的现象,此时编码效率会大大降低。HZ编码的具体算法可以参见图3.2。
图3.2 HZ编码算法
实验原理
一、位运算
C和C++语言具有很强的位运算能力,因此可以方便地对数据按位进行精细操作。C和C++主要提供了&(位与)、|(位或)、~(位取反)、>>(右移)、<<(左移)和^(异或)运算符。其中位与(&)运算可以把指定位强制变成0,也可以测试指定位是0还是1,位或(|)运算可以把指定位置成1。
二、三字节变四字节
通过移位和位与(&)运算结合,可以很方便地测试一个变量的指定位是1还是0,也可以精确地将变量中的指定位强行置为0。图3.3显示了将三字节转四字节的过程,只需要循环执行该过程,就可以执行大量数据的转换。
图3.3 Base64三字节变四字节编码算法
三、文件级的Base64编码与解码程序
·Base64编码
对于文件级的Base64编码,由于被编码的文件未必是文本文件,有可能是二进制文件,所以输入文件需要用二进制的方式打开。而编码后的文件一定是文本文件,所以可以用二进制方式打开,也可以用文本方式打开。
文件级的编码程序特别要注意的是:当输入文件的字节数不是3的倍数时,此时需要在转换后的最后面补充“=”,以保证编码的字节结果是4的倍数。
如果考虑提高效率,在读源文件的时候,可以一次性读取一批数据,而不是每次都是读取三个字节进行编码。
·Base64解码
与编码程序相对,解码的输入可以用文本文件或二进制文件方式打开,而输出应该是一个二进制文件。由于正常编码后的数据文件的长度应该是4的倍数,所以在解码时需要忽略最后的“=”。
实验环境
一、操作系统
Windows 2000以上版本,例如,Windows 2000/XP/Vista/7/8/8.1/10等。
二、开发环境
Visual Studio 6.0以上版本,例如,Visual Studio 6.0/2003/2005/2008/2010/2012/2013等。
实验步骤
1.熟悉位运算,编写程序将用户输入的一个无符号短整数(16位)以二进制方式输出。请把程序填写到实验报告中。
2.编写Base64编码函数,请在实验报告中给出函数的实现代码,函数原型如下:
void Base64Encode(unsigned char*src,char*des)
3.设计一个文件级的Base64编码器,并在实验报告中用流程图绘制出算法。
4.编写Base64解码函数,请在实验报告中给出函数的实现代码,函数原型如下:
void Base64Decode(char*src,unsigned char*des)
5.设计一个文件级别的Base64的解码器,请把实现算法用流程图绘制在实验报告中。
思考题
1.编写一个基于GBK的HZ编码和解码器,实现GBK内码和HZ编码的文件级转换。
2.比较Base64和HZ编码的优劣。
3.汉字交换码的编码与解码其实也可以看成是一个加密与解密的过程,请根据Base64编码与解码算法,自己设计一个简单的加密算法。
[1]RFC1341.http://www.ietf.org/rfc/rfc1341.txt.
[2]HZ(character encoding).https://en.wikipedia.org/wiki/HZ_(character_encoding).
[3]罗江华.基于MD5与Base64的混合加密算法[J].计算机应用,2012(A01):47-49.
[4]刘萍,谭建龙,沙瀛.针对垃圾邮件的直接多关键词匹配算法[J].计算机工程,2005(13):59-61.
[5]陈雅芳,徐从富.基于Base64编码的垃圾图片过滤方法[J].计算机工程,2011(08):194-196.
[6]李岚.基于BASE64编码的电子支付系统安全性分析[J].微计算机信息,2006(21):178-179,221.
[7]陈训逊,方滨兴,李蕾.MIME解码算法优化问题研究[J].计算机应用,2003(S2):263-265.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。