專利名稱:文本文件數(shù)據(jù)壓縮的無損變換的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域文本文件的一種壓縮方法,特別是文本文件數(shù)據(jù)壓縮的無損變換。
人類社會已進(jìn)入了信息時(shí)代,對于浩如煙海的數(shù)據(jù)必須進(jìn)行有效的壓縮,才能減少數(shù)據(jù)的存儲容量,節(jié)約數(shù)據(jù)傳輸時(shí)間,提高人類資源利用率,獲得更大的經(jīng)濟(jì)效益。經(jīng)過科技工作者幾十年的不懈努力,數(shù)據(jù)壓縮的理論和方法不斷成熟和完善,有效實(shí)用的壓縮方法不斷產(chǎn)生。1952年霍夫曼(D.A.Huffman)給出了最優(yōu)變長碼的構(gòu)造方法,由此方法編寫的軟件已廣泛應(yīng)用于數(shù)據(jù)通訊,計(jì)算機(jī)文件壓縮等。1976年,里斯桑內(nèi)(J.Rissanen)給出了算術(shù)編碼(Arithemtic Coding)。1977年到1978年,J acob Ziv和Abraham Lempel在IEEE Transaction on Information Theory上發(fā)表了論文《順序數(shù)據(jù)壓縮的一個(gè)通用方法》(AUniversal Alogrithem for Seqential DataCompression),及續(xù)篇《通過可變換比率編碼的獨(dú)立順序的壓縮》(Copression of Individual viaVariable--Rato Coding),開創(chuàng)了基于字典壓縮的先河。在這些數(shù)據(jù)壓縮理論的指導(dǎo)下,人們先后編寫了許多實(shí)用的壓縮軟件,如arj.exe,pkzip.exe,lzss.exe,arith.exe等。盡管以上方法是非常有效和實(shí)用的,但其壓縮并未達(dá)到理論上的極限,而且也沒有利用中文文本的特點(diǎn),此外,目前計(jì)算機(jī)上常用的中西文編輯軟件(如WPS,EDIT)等都沒有實(shí)時(shí)壓縮功能,常常是在需傳輸時(shí)或永久保存時(shí)才壓縮,實(shí)際上多占了存貯空間。
本發(fā)明的目的是,利用中文文本文件的特點(diǎn),提出一種文本文件數(shù)據(jù)壓縮的W-變換,它可有效地對中文文本文件實(shí)施壓縮,進(jìn)一步提高中西文文本文件的壓縮比。
本發(fā)明的目的是這樣實(shí)現(xiàn)的,文本文件數(shù)據(jù)壓縮的W-變換是一個(gè)基于字典的變換。眾所周知,國標(biāo)漢字庫(GB2312-80)是用16位來對漢字編碼的,這種編碼只是為兼顧中西文而設(shè)計(jì)的,其冗余空間是很大的。由于漢字文本的特點(diǎn),往往不是單個(gè)漢字出現(xiàn),而是前后關(guān)聯(lián)的,為利用這種前后關(guān)聯(lián)性,本發(fā)明人選擇了漢字文本中最常用雙字詞為一字典,每個(gè)雙字詞用16位來編碼,因此只要文本中出現(xiàn)雙字詞,W-變換后對此就有壓縮。
其具體實(shí)現(xiàn)方法如下,1).對于源碼為ASCII碼的,其源碼高位置1,2).對于源碼為換行符即其ASCII碼為0D,0A的,將其變換后,置為0x81H,3).對于漢字“的”,變換后將其置為0x82H,4).對于不能組成中文詞組的單字和圖形符號, 將其劃分為頁,每頁256個(gè)漢字,對其變換后,其編碼第一字節(jié)是頁碼+1,編碼第二字節(jié)該頁在漢字庫中的偏移地址,5).對于能組成中文詞組的雙字詞組,是將詞組劃分為頁,每頁256個(gè)詞組,變換后的編碼第一字節(jié)是頁碼+4)中所述的單字劃分為頁后所占的總頁碼,編碼第二字節(jié)是其在漢字庫中的偏移地址。
本發(fā)明的積極效果如下,
這種編碼方法,對ASCII碼來說,實(shí)際上只用了7位,高位1是解碼時(shí)的標(biāo)志;對漢字符號或雙字詞,由于最大頁碼小于127,實(shí)際上只用了17位編碼,第16位上的“0”也是一個(gè)解碼時(shí)的標(biāo)致。這樣解碼時(shí)先讀一個(gè)字節(jié),高位是1,輸出ASCII碼,或換行符,或漢字“的”;如果高位是0,讀下一字節(jié),頁碼小于40,輸出單字或符號,否則輸出雙字??梢?,解碼程序速度非??臁?br>
以下結(jié)合實(shí)施例對本發(fā)明作進(jìn)一步說明,其變換方法見下表
<p>發(fā)明人應(yīng)用Turbo C 2.01為本發(fā)明編制的文本文件數(shù)據(jù)壓縮的W-變換程序如下,編碼程序<pre listing-type="program-listing"><![CDATA[/* W-transform c-code *//* Wang Gouan 1997, 10*/#include "stdio.h"#include "stdlib.h"#include "string.h"#include "alloc.h"char *pt1;char *pt2;char ch[4];FILE *fp1, *fp2, *fp3;int main(int argc,char *argv[]){void iuittab1(char *pt1,F(xiàn)ILE *fp3); void inittab2(char *pt2,F(xiàn)ILE *fp3); int outputword(FILE *fp2,char *ch); int c; int flag; int i=0; if(argc<2) { printf(" Useagewtf inputfile outfile") exit (0);} if((fp1=fopen (argv[1],"rb") )<0) [printf("can’t open input file"); exit(0);} if((fp2=fopen (argv[2],"wb") )<0) {printf("can’t open output file"); exit(0);} if((fp3=fopen("wordtab. bin","rb"))<0) {printf("can’t open wordtab. bin file") exit(0);} if((pt1=malloc(20304))?。絅ULL) {inittab1(pt1,fp3); } else { printf("memery alloc error!");exit(0); } if((pt2=malloc(25126))!=NULL) inittab2(pt2,fp3); else {printf("memery alloc error!");exit(0);}flag=0;while((c=getc(fp1))?。紼OF){ch[flag]=(char)c; flag=flag+1; if(flag==4){ flag=outputword(fp2,ch); i++; if(i==255){printf(".");i=0;} } } if(flag>0)fputc(0x80,fp2); switch(flag){ case 0break; case 1 fputc(ch
,fp2); break; case 2 fputc(ch
,fp2) fputc(ch[1],fp2) break; case 3 fputc(ch
,fp2) fputc(ch[1],fp2) fputc(ch[2],fp2) break; } fclose(fp1); fclose(fp2); fclose(fp3); free(pt1); free(pt2);return(0); } void inittab1(char *p,F(xiàn)ILE *fp3) { char ch[3]; int i; int ct; int of=0; int tof; for (i=0;i<20304;i++) p[i]=0; i=0; while(i<2467) { fread (ch,3,1,fp3); i++; tof=of; of=of+(int)ch[2]; ct=(int)(ch
-160-16)*94+(int)(ch[1]-160-1); ct=ct*3; pt1[ct]=ch[2]; pt1[ct+1]=(char)(tof/256); pt1[ct+2]=(char)(tof%256); } }void inittab2(char *pt2,F(xiàn)ILE *fp3) { char ch [2]; int i=0; fseek(fp3,7402L,0); while(fread(ch,2,1,fp3)>0) { pt2[i]=ch
; i++; pt2[i]=ch[1]; i++; } }int outputword(FILE *fp2,char *ch)int flag; unsigned int p; unsigned int length,dist; int i; unsigned int offset; unsigned int bm; if((ch
==0x0d)&&(ch[1]==0x0a)) { fputc (0x81,fp2); ch
=ch[2]; ch[1]=ch[3]; return(2); } if(ch
<0xa0) { fputc((ch
|0x80),fp2); ch
=ch[1]; ch[1]=ch[2]; ch[2]=ch[3]; return(3);} if(((ch
-0xa0)<16)||((ch
-0xa0)>78)) { bm=(ch
-0xa0-1)*94+(ch[1]-0xa0-1 fputc((char)(bm/256+1),fp2); fputc((char)(bm%256),fp2); ch
=ch[2]; ch[1]=ch[3]; return(2); } if((ch
==181)&&(ch[1]==196)) { fputc(0x82,fp2); ch
=ch[2]; ch[1]=ch[3]; return(2); }p=(unsigned int)(ch
-0xa0-16)*94+(unsigned int)(ch[1]-0xa0-1)p=p*3;length=(unsigned int)(pt1[p+1]) *256+(char)pt1[p+2];dist=pt1[p];if(dist>0) { length=(length)*2; dist=dist*2; i=0;while((i<dist)&&(pt2[length+i]?。絚h[2])||(pt2[length+i-1]?。絚h[3])) i=i+2; if(i<dist) { offset=(length+1+i)/2; fputc((char)(offset/256+40),fp2); fputc((char)(offset%256),fp2); return(0);} } bm=(ch
-0xa0-1)*94+(ch[1]-0xa0-1); fputc((char)(bm/256+1),fp2); fputc((char)(bm%256),fp2); ch
=ch[2]; ch[1]=ch[3]; return(2); }]]></pre>程序說明(1).編碼(W-變換)程序中用到了一個(gè)數(shù)據(jù)文件(Wordtab.bin),長度為32528字節(jié),其結(jié)構(gòu)如下第一部分共7402字節(jié)。(即2467*3+1),每三個(gè)字節(jié)為一變量第一、二字節(jié)為漢字內(nèi)碼,所選漢字為所有雙字詞的第一個(gè)字(不重復(fù),共2467個(gè)),第三字節(jié)為該漢字所組成的詞組個(gè)數(shù);最后一個(gè)字節(jié)為一分隔符(0xFFH)。
第二部分共25126個(gè)字節(jié)。依次存儲雙字詞字典中第二個(gè)漢字的內(nèi)碼。
指針pt1指向第一個(gè)緩存區(qū),長度為72*94*3=20304字節(jié),即從16區(qū)到87區(qū)的漢字每字分配三個(gè)字節(jié)的單元,如果該字屬于雙字詞的第一字,則這三個(gè)字節(jié)的第一個(gè)字節(jié)置該字能組成雙字詞的個(gè)數(shù)(dist),第二、三字節(jié)為16位無符號整數(shù),存儲該字組成雙字詞的第二個(gè)字在pt2中的偏移地址(length);否則,三個(gè)字節(jié)全為0°指針pt2指向第二個(gè)內(nèi)存區(qū),長度為12563*2=15126字節(jié),依次存放雙字詞的第二個(gè)字。
應(yīng)用pt1和pt2的目的是要加快查找速度當(dāng)輸入文件讀到一個(gè)漢字后,由內(nèi)碼計(jì)算出它在pt1中的偏移地址p,如果pt1[p]等于0,則該字不組成詞組,直接按編碼方法輸出;否則,該字可能組成詞組,再讀第二個(gè)漢字,用第二個(gè)漢字與pt2[length]到pt2[length+dist]之間的串進(jìn)行比較,如果查到,輸出詞組編碼,否則輸出第一個(gè)字,返回??梢?,由于dist平均長度為5,這就大大縮短了查找速度,提高了程序運(yùn)行速度。
應(yīng)用本程序?qū)ξ谋疚募嚎s后的實(shí)驗(yàn)結(jié)果這里選擇了5個(gè)文本文件作為實(shí)驗(yàn)例文。其中shy1.txt是W-變換的雙字詞字典文件,其壓縮效果最好,比arj.exe提高了20%左右。shy.txt是一個(gè)中英文及表格混排文件。其它三個(gè)文件分別為新聞,股評或論文等。比較結(jié)果如下表。
(見下頁)
W-變換與Huff1,Arj,Pkzip之比較
注表中所用百分比為(源文件長-壓縮后文件長)/源文件長*100/100
權(quán)利要求
1.一種文本文件數(shù)據(jù)壓縮的W-變換,實(shí)現(xiàn)其的方法特征在于,1).對于源碼為ASCII碼的,其源碼高位置1,2).對于源碼為換行符即其ASCII碼為0D,0A的,將其變換后,置為0x81H,3).對于漢字“的”,變換后將其置為0x82H,4).對于不能組成中文詞組的單字和圖形符號,將其劃分為頁,每頁256個(gè)漢字,對其變換后,其編碼第一字節(jié)是頁碼+1,編碼第二字節(jié)該頁在漢字庫中的偏移地址,5).對于能組成中文詞組的雙字詞組,是將詞組劃分為頁,每頁256個(gè)詞組,變換后的編碼第一字節(jié)是頁碼+4)中所述的單字劃分為頁后所占的總頁碼,編碼第二字節(jié)是其在漢字庫中的偏移地址。
全文摘要
本發(fā)明涉及一種文本文件數(shù)據(jù)壓縮的W-變換,其方法特征是,對于源碼為ASCII碼的,其源碼高位置1,對于不能組成中文詞組的單字和圖形符號,將其劃分為頁,對其變換后,其編碼第一字節(jié):是頁碼+1,編碼第二字節(jié):該頁在漢字庫中的偏移地址,對于能組成中文詞組的雙字詞組,是將詞組劃分為頁,每頁變換后的編碼是采用頁碼和其在漢字庫中的偏移地址。應(yīng)用本發(fā)明可大大提高對中西文文本文件的壓縮比。
文檔編號H03M7/30GK1191355SQ9710854
公開日1998年8月26日 申請日期1997年12月8日 優(yōu)先權(quán)日1997年12月8日
發(fā)明者王國安 申請人:王國安