| 文件内容浅析 |
|
本文先介绍了文件的扩展名和文件内容之间的关系,然后介绍了ASCII码,以及与相应数值的关系。本文推出了"准文本文件"的概念。读者应具备二进制与16进制数及相互转换的基本知识,在最后一节有简要介绍。本文适合于电脑初学者。 1.文件类型及其扩展名 在电脑中,不管是一篇文章,还是一个软件的执行程序,或是一首歌,都是以文件的形式保存的。文件名一般分两部分,小数点后面的部分称作扩展名。如果你看不到文件的扩展名,请在windows桌面中进入"我的文档",点击"查看(或工具)"中的"文件夹选项",选"查看"一页,将"隐藏已知文件类型的扩展名"前面的打勾去掉,"确定"后退出。 当你用鼠标迅速双击一个文件时,如果是可执行的程序,它就开始运行了,否则的化,电脑就会根据文件的扩展名的"关联",启动一个软件来打开该文件。如果电脑无法判断用什么软件来打开的话,就会要你自己根据文件的扩展名来选择一个软件来打开。因此,你应该知道哪些文件是可以打开的,用什么软件可以打开。 如果文件的扩展名是"exe"、"com"、"bat"等,说明这些文件是可执行文件。你若用鼠标右键点击它,选择"打开",它就运行了。一般来说,此时会启动一个软件。但有些可执行文件(包括"dll"类型)应该是由某软件来执行,在后台执行。你去打开它,它也无法正常工作,此时要么给出一个出错信息,要么没动静。"exe"、"com"、"dll"类型的文件中保存的数据一般是有运行代码,有数值(整数或浮点数),还有ASCII格式的信息(字符串)。 如果文件中保存的数据不含运行代码,只有数值(整数或浮点数)和ASCII格式的信息(字符串),可以称之为数据文件,如股票分析软件、财会软件、游戏软件的存盘文件,以及数据库文件,图象文件和声音文件等。 有一种很重要的文件类型是文本文件类型,其典型的扩展名是"txt"。文本文件中储存的信息从头到尾是以ASCII格式保存的,而不仅仅是个"字符串"。还有许多文件,尽管一般不称之为文本文件,但它们保存的数据也是以ASCII格式保存的,所以可称之为准文本文件。这些文件的扩展名有"c"、"cpp"、"bat"、"js"、"java"、"htm"、"html"、"ini"、"pl"、"CGI"、"php"等。所有的ASCII码文件都可以用文本编辑软件如"记事本"或"写字板"来打开,其内容一目了然。当然,它们中的许多都有自己的专用软件。 有人将"doc"类型的文件也称之为"文本文件",这是不妥的,因为"doc"文件中除了有可读的ASCII信息外,还有排版信息,这些排版信息在用"word"或"写字板"打开文件后不显示出来,用文本编辑软件打开时见到的是乱码。而"htm"类型的文件虽然也含排版信息,但排版信息也是用ASCII码写的。虽然用IE打开时见不到排版信息,但用文本编辑软件打开时能看见,所以当属准文本文件。十多年前还没有word、wps时,我们用PE编写的文本文件的排版命令,包括字号、字型,也都是用ASCII码写的。 2.ASCII码 许多类型的文件中都可能含有ASCII码内容,那么什么是ASCII码呢?事实上,ASCII码是可读字符的一种存储方式。 计算机存储的数据都是以二进制表示的。一个英文字符存储时占用一个字节,8位。写文章时A储存为01000001(就好象8个灯泡,只有第2个和最后一个发光),用16进制表示是41H或0x41,用十进制表示就是65,这些就是A的ASCII码。当用软件将文件以文本方式打开时,每个字节的内容就被翻译成字符显示出来。如果字节内容是01000001,就会看到A。 一个汉字要用两个字节表示,"谅"的ASCII码为11000001、11000010(就好象16个灯泡分成两排,其中有特定6个是亮的)。如果你用任何文本编辑软件输入一个汉字"谅",存盘(txt类型)后再用16进制文件编辑软件打开,就会看到c1、c2,这就是"谅"的ASCII码。如果将"谅"字的两个ASCII码最高位(即最左边的位)的1改成0,成了01000001、01000010(即16进制的41、42),存盘后改用文本编辑软件打开,看到的将是AB。显然,系统在处理ASCII码时,根据其最高位是1还是0,决定将其显示成汉字还是英文字母。事实上,"谅"的ASCII码本来就是41H、42H,为了与英文字母"AB"区分,存储时用c1H、c2H。 汉字的双字节表示法在特定的场合会带来麻烦。例如,当我们使用查询系统,搜索含“写”的字符串时,有时查到的字符串里并不含“写”这个字,而是含象“中从”这样的两个汉字。原来“中从”的ASCII码是d6d0b4d3(16进制),其中间部分的d0b4恰好是“写”的 ASCII码。本人曾花费大量的时间寻找查询程序的错误,谁知结果竟是汉字编码的天生缺陷。 3.数值 许多文件中都可能含有数值,例如记录股票的价格,记录颜色的三色分量值等。不管是整数还是浮点数(非整数),一般都用四个字节储存。 将一个10进制整数-1027489087或一个10进制浮点数-96.880379用编程的方法存入文件后,四个字节的内容(16进制)为c1、c2、c1、c2(高位在后)。用文本编辑器强行打开此文件,将会看到"谅谅"。显然,系统已经无法判断这是数值了,将其按照ASCII方式显示了出来,这就是所谓"乱码"。程序员用编程的方法可以将文件打开,把这四个字节的内容调入内存,还原成整数或是浮点数,然后显示出来或进行某种运算后转换成颜色、声音的一部分等。 下面看看perl语言的一段代码,文件.pl的内容是 #!/usr/local/bin/perl print "Content-type:text/html\n\n"; $long="%C1%C2%C1%C2"; $long=~s/%([0-9A-H]{2})/pack('C',hex($1))/eg; print"$long\n"; exit 0; 其输出值就是∶谅谅。但实际上$long的值是C1HC2HC1HC2H,也就是-1027489087或-96.880379。 下面是一段C代码(最后一句使用了API函数),用Borland c++ builder4编译并执行,具有易移值性。 void __fastcall TForm1::FormCreate(TObject *Sender) { int i; unsigned char ch[5]; unsigned char *c; float f; c=(unsigned char*)&f; f=-96.880379; for(i=0;i<4;i++) ch[i]=*(c+i); ch[4]='\0'; MessageBox((HWND)Application->Handle,(char*)ch,"-96.880379的ASCII码",MB_OK); } 其输出值也是∶谅谅。 4.代码 用16进制文件编辑软件打开一个可执行文件,所看到的字节内容除了可能是数值和ASCII码之外,还有可能是执行代码。这涉及到汇编知识,就不详细介绍了。 5.16进制文件编辑软件 16进制文件编辑软件是用来以16进制方式打开文件的,用它可以看到文件的每个字节的内容,至于内容是运行代码、数值,还是字符串的ASCII码,就得自己判断了。16进制文件编辑软件被运用最多的情况是修改游戏进度的存盘文件,用比较两个存盘文件微小区别的方法找到某个数值的位置,将相关字节的内容改到最大,然后存盘。该作弊行为曾风行一时,许多电脑高手和"中手"当初都干过此事。 在DOS时代,最有名的16进制文件编辑软件当属PCTOOLS。到了Windows时代,各种32位的16进制文件编辑软件取而代之,较流行的有Windows Commander、UltraEdit-32等,不过一般都是英文软件。 笔者编写的"磁盘数据维护"软件,也是一个16进制文件编辑软件,而且是中文版本。该软件编辑功能虽然不强,但查找功能(不但可以查找字符串,还可以查找整数、浮点数)和内容判读(同时以字符串、整数、浮点数方式显示4个字节的内容)功能较新颖。 6.二进制与16进制数的转换 (1)记住a=十;b=十一;c=十二;d=十三;e=十四;f=十五。 (2)把一个字节二进制数(8位)分成两段(每段4位),分别转换。 每段的最高位(左边第一位)是1就代表八;其他位是1分别代表四、二、一。4位数的值全部相加,超过九就用字母(a-f)表示。转换完毕后将两段的数写到一起。 例如11000001分成两段为1100和0001,第一段4位相加后为十二,写成c;第二段相加后为一,仍写作1。合并后就是c1,在前面放上0x或后面放上H都是表明16进制数。 |