文本文件數據壓縮的無損變換的製作方法
2023-09-17 01:32:25 4
專利名稱:文本文件數據壓縮的無損變換的製作方法
技術領域:
本發明涉及計算機領域文本文件的一種壓縮方法,特別是文本文件數據壓縮的無損變換。
人類社會已進入了資訊時代,對於浩如煙海的數據必須進行有效的壓縮,才能減少數據的存儲容量,節約數據傳輸時間,提高人類資源利用率,獲得更大的經濟效益。經過科技工作者幾十年的不懈努力,數據壓縮的理論和方法不斷成熟和完善,有效實用的壓縮方法不斷產生。1952年霍夫曼(D.A.Huffman)給出了最優變長碼的構造方法,由此方法編寫的軟體已廣泛應用於數據通訊,計算機文件壓縮等。1976年,裡斯桑內(J.Rissanen)給出了算術編碼(Arithemtic Coding)。1977年到1978年,J acob Ziv和Abraham Lempel在IEEE Transaction on Information Theory上發表了論文《順序數據壓縮的一個通用方法》(AUniversal Alogrithem for Seqential DataCompression),及續篇《通過可變換比率編碼的獨立順序的壓縮》(Copression of Individual viaVariable--Rato Coding),開創了基於字典壓縮的先河。在這些數據壓縮理論的指導下,人們先後編寫了許多實用的壓縮軟體,如arj.exe,pkzip.exe,lzss.exe,arith.exe等。儘管以上方法是非常有效和實用的,但其壓縮並未達到理論上的極限,而且也沒有利用中文文本的特點,此外,目前計算機上常用的中西文編輯軟體(如WPS,EDIT)等都沒有實時壓縮功能,常常是在需傳輸時或永久保存時才壓縮,實際上多佔了存貯空間。
本發明的目的是,利用中文文本文件的特點,提出一種文本文件數據壓縮的W-變換,它可有效地對中文文本文件實施壓縮,進一步提高中西文文本文件的壓縮比。
本發明的目的是這樣實現的,文本文件數據壓縮的W-變換是一個基於字典的變換。眾所周知,國標漢字庫(GB2312-80)是用16位來對漢字編碼的,這種編碼只是為兼顧中西文而設計的,其冗餘空間是很大的。由於漢字文本的特點,往往不是單個漢字出現,而是前後關聯的,為利用這種前後關聯性,本發明人選擇了漢字文本中最常用雙字詞為一字典,每個雙字詞用16位來編碼,因此只要文本中出現雙字詞,W-變換後對此就有壓縮。
其具體實現方法如下,1).對於源碼為ASCII碼的,其源碼高位置1,2).對於源碼為換行符即其ASCII碼為0D,0A的,將其變換後,置為0x81H,3).對於漢字「的」,變換後將其置為0x82H,4).對於不能組成中文詞組的單字和圖形符號, 將其劃分為頁,每頁256個漢字,對其變換後,其編碼第一字節是頁碼+1,編碼第二字節該頁在漢字庫中的偏移地址,5).對於能組成中文詞組的雙字詞組,是將詞組劃分為頁,每頁256個詞組,變換後的編碼第一字節是頁碼+4)中所述的單字劃分為頁後所佔的總頁碼,編碼第二字節是其在漢字庫中的偏移地址。
本發明的積極效果如下,
這種編碼方法,對ASCII碼來說,實際上只用了7位,高位1是解碼時的標誌;對漢字符號或雙字詞,由於最大頁碼小於127,實際上只用了17位編碼,第16位上的「0」也是一個解碼時的標緻。這樣解碼時先讀一個字節,高位是1,輸出ASCII碼,或換行符,或漢字「的」;如果高位是0,讀下一字節,頁碼小於40,輸出單字或符號,否則輸出雙字。可見,解碼程序速度非常快。
以下結合實施例對本發明作進一步說明,其變換方法見下表
發明人應用Turbo C 2.01為本發明編制的文本文件數據壓縮的W-變換程序如下,編碼程序<![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,FILE *fp3); void inittab2(char *pt2,FILE *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))!=NULL) {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))!=EOF){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,FILE *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,FILE *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]!=ch[2])||(pt2[length+i-1]!=ch[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); }]]>程序說明(1).編碼(W-變換)程序中用到了一個數據文件(Wordtab.bin),長度為32528位元組,其結構如下第一部分共7402位元組。(即2467*3+1),每三個字節為一變量第一、二字節為漢字內碼,所選漢字為所有雙字詞的第一個字(不重複,共2467個),第三字節為該漢字所組成的詞組個數;最後一個字節為一分隔符(0xFFH)。
第二部分共25126個字節。依次存儲雙字詞字典中第二個漢字的內碼。
指針pt1指向第一個緩存區,長度為72*94*3=20304位元組,即從16區到87區的漢字每字分配三個字節的單元,如果該字屬於雙字詞的第一字,則這三個字節的第一個字節置該字能組成雙字詞的個數(dist),第二、三字節為16位無符號整數,存儲該字組成雙字詞的第二個字在pt2中的偏移地址(length);否則,三個字節全為0°指針pt2指向第二個內存區,長度為12563*2=15126位元組,依次存放雙字詞的第二個字。
應用pt1和pt2的目的是要加快查找速度當輸入文件讀到一個漢字後,由內碼計算出它在pt1中的偏移地址p,如果pt1[p]等於0,則該字不組成詞組,直接按編碼方法輸出;否則,該字可能組成詞組,再讀第二個漢字,用第二個漢字與pt2[length]到pt2[length+dist]之間的串進行比較,如果查到,輸出詞組編碼,否則輸出第一個字,返回。可見,由於dist平均長度為5,這就大大縮短了查找速度,提高了程序運行速度。
應用本程序對文本文件壓縮後的實驗結果這裡選擇了5個文本文件作為實驗例文。其中shy1.txt是W-變換的雙字詞字典文件,其壓縮效果最好,比arj.exe提高了20%左右。shy.txt是一個中英文及表格混排文件。其它三個文件分別為新聞,股評或論文等。比較結果如下表。
(見下頁)
W-變換與Huff1,Arj,Pkzip之比較
注表中所用百分比為(源文件長-壓縮後文件長)/源文件長*100/100
權利要求
1.一種文本文件數據壓縮的W-變換,實現其的方法特徵在於,1).對於源碼為ASCII碼的,其源碼高位置1,2).對於源碼為換行符即其ASCII碼為0D,0A的,將其變換後,置為0x81H,3).對於漢字「的」,變換後將其置為0x82H,4).對於不能組成中文詞組的單字和圖形符號,將其劃分為頁,每頁256個漢字,對其變換後,其編碼第一字節是頁碼+1,編碼第二字節該頁在漢字庫中的偏移地址,5).對於能組成中文詞組的雙字詞組,是將詞組劃分為頁,每頁256個詞組,變換後的編碼第一字節是頁碼+4)中所述的單字劃分為頁後所佔的總頁碼,編碼第二字節是其在漢字庫中的偏移地址。
全文摘要
本發明涉及一種文本文件數據壓縮的W-變換,其方法特徵是,對於源碼為ASCII碼的,其源碼高位置1,對於不能組成中文詞組的單字和圖形符號,將其劃分為頁,對其變換後,其編碼第一字節:是頁碼+1,編碼第二字節:該頁在漢字庫中的偏移地址,對於能組成中文詞組的雙字詞組,是將詞組劃分為頁,每頁變換後的編碼是採用頁碼和其在漢字庫中的偏移地址。應用本發明可大大提高對中西文文本文件的壓縮比。
文檔編號H03M7/30GK1191355SQ9710854
公開日1998年8月26日 申請日期1997年12月8日 優先權日1997年12月8日
發明者王國安 申請人:王國安