一種文件的實時壓縮方法
【專利摘要】本方法應用于實時文件傳輸壓縮領域。要對一個通過網(wǎng)絡傳輸?shù)奈募M行壓縮,傳統(tǒng)的做法是等文件傳輸完后保存到本地存儲空間中,再對文件進行掃描,通過統(tǒng)計文件中字符出現(xiàn)的概率分布情況,制定合適的編碼策略,然后第二次掃描文件,對文件的每個字符生成壓縮編碼,寫入到壓縮文件中,最后刪除原文件。網(wǎng)絡傳輸和掃描,占用了大量的時間,而且在壓縮的過程中原始文件和壓縮文件同時存在,會占用本地存儲空間。本發(fā)明是為了創(chuàng)造一種針對網(wǎng)絡傳輸?shù)奈募M行快速壓縮的方法,當文件傳輸完畢后,壓縮文件就已經(jīng)生成,同時在壓縮的過程中不會占用其他的存儲空間。
【專利說明】一種文件的實時壓縮方法 一、技術領域
[0001] 本發(fā)明應用于網(wǎng)絡數(shù)據(jù)傳輸文件壓縮與解壓縮領域,主要解決在網(wǎng)絡傳輸文件數(shù) 據(jù)過程中,邊傳輸邊壓縮的問題。 二、
【背景技術】
[0002] 要對一個通過網(wǎng)絡傳輸?shù)奈募M行壓縮,傳統(tǒng)的做法是等文件傳輸完后,保存到 本地存儲空間中,再對文件進行掃描,通過統(tǒng)計文件中字符出現(xiàn)的概率分布情況,制定合適 的編碼策略,然后第二次掃描文件,對文件的每個字符應用壓縮編碼,寫入到壓縮文件中, 最后刪除原始文件。網(wǎng)絡傳輸和兩次掃描,占用了大量的時間,而且在壓縮的過程中原始文 件和壓縮文件同時存在,如果文件較大,會占用大量存儲空間。本發(fā)明主要是為了創(chuàng)造一種 針對網(wǎng)絡傳輸?shù)奈募M行快速壓縮、壓縮過程中不占用其他存儲空間的方法。 三、
【發(fā)明內容】
[0003] -個發(fā)送端向一個接收端發(fā)送文件,接收端一邊接收文件一邊對文件進行壓縮, 等到文件發(fā)送完畢后,壓縮文件也同時生成,壓縮的過程中不會產生臨時文件,不會占用其 他的存儲空間。
[0004] 1.發(fā)送端和接收端通過兩個TCP連接進行通信,一個連接負責發(fā)送指令,一個連 接負責發(fā)送數(shù)據(jù)。
[0005] 2.發(fā)送端通過指令發(fā)送連接發(fā)出文件發(fā)送請求,請求的消息格式如下:
[0006] type, fid, file-size,filename-length, filename。
[0007] type :8bit,無符號數(shù),消息的類型,發(fā)送請求消息為1。
[0008] fid :64bit,無符號數(shù),被傳輸文件的唯一標識符,指令傳輸TCP連接成功后,fid被 初始化為一個〇~2~64-1之間的隨機數(shù),每傳輸完一個文件該數(shù)值就增加一,到達2~64-1 后回到0,以此規(guī)律循環(huán)。
[0009] file-size :64bit,無符號數(shù),文件大小。
[0010] filename-length :16bit,無符號數(shù),文件名長度。
[0011] filename :長度不限制,字符串,文件名內容。
[0012] 3.接收端進行請求的回復,正常的回復(準備接收)消息格式如下:
[0013] type, fid
[0014] type :8bit,無符號數(shù),消息的類型,準備接收為2。
[0015] fid :64bit,無符號數(shù),要被接收的文件的唯一標識符。
[0016] 出錯時的回復消息格式如下:
[0017] type, fid, code
[0018] type :8bit,無符號數(shù),消息的類型,出錯消息為3。
[0019] fid :64bit,無符號數(shù),要被接收的文件的唯一標識符。
[0020] code :8bit,無符號數(shù),出錯原因代碼。具體如下表:
[0021]
[0022] 4.接收端在本地存儲中創(chuàng)建壓縮文件,文件名原文件名加上gmf",文件開頭的 內容如下:
[0023] file-size, filename-length, filename
[0024] file-size :64bit,無符號數(shù),文件大小。
[0025] filename-length :16bit,無符號數(shù),文件名長度。
[0026] filename :不限制長度,字符串,文件名。
[0027] 5.接收端初始化編碼樹,該樹只有一個空葉節(jié)點,符號為TERM,權值始終為0,編 號為1024。
[0028] 6.發(fā)送端通過數(shù)據(jù)發(fā)送連接開始發(fā)送數(shù)據(jù),接收端進行數(shù)據(jù)接收。接收端每讀進 一個字符,檢查該字符是否存在于編碼樹中:
[0029] 1)如果不存在,則對該字符進行編碼,從樹的根節(jié)點開始一直到TERM字符,經(jīng)過 左孩子就編碼為〇,經(jīng)過右孩子編碼為1,直到到達該字符,最后加上該字符本身,產生的編 碼寫入壓縮文件中。然后生成一棵子樹,用這棵子樹代替原來的TERM結點,該子樹的父節(jié) 點符號為空,權值為1 (TERM的權值0加上新的加入的符號節(jié)點權值1),編號為TERM原來 的編號,其右分支節(jié)點為剛讀入的字符,該結點符號為該字符,權值為1,編號為現(xiàn)在父節(jié)點 編號減去1,左分支節(jié)點為一個新的空葉結點TERM,編號為現(xiàn)在父節(jié)點編號減去2。因為加 入了新的節(jié)點,所以各個需要調整各個節(jié)點的權值,根據(jù)節(jié)點編號由小到大的順序,在修改 權值之前,將當前節(jié)點與塊中具有相同權值的編號最大的節(jié)點進行交換(只交換字符和權 值,不交換編號),并使后者的父節(jié)點成為新的當前節(jié)點,直到遇到根節(jié)點為止。
[0030] 2)如果存在,則對該字符進行編碼,從樹的根節(jié)點開始一直到該字符,經(jīng)過左孩子 就編碼為〇,經(jīng)過右孩子編碼為1,直到到達該字符,產生的編碼寫入壓縮文件中。然后調整 各個節(jié)點的權值,根據(jù)節(jié)點編號由小到大的順序,在修改該節(jié)點的權值之前,將當前節(jié)點與 塊中具有相同權值的編號最大的節(jié)點進行交換,并使后者的父節(jié)點成為新的當前節(jié)點,直 到遇到根節(jié)點為止。
[0031] 7.發(fā)送端發(fā)送完數(shù)據(jù)后,在指令TCP連接上發(fā)出文件發(fā)送完畢消息,消息格式如 下:
[0032] type, fid
[0033] type :8bit,無符號數(shù),消息的類型,發(fā)送完畢消息為4。
[0034] fid :64bit,無符號數(shù),已發(fā)送完畢的文件的唯一標識符。
[0035] 8.接收端接收到文件發(fā)送完畢消息后,正常情況下返回成功接收消息,消息格式 如下:
[0036] type, fid
[0037] type :8bit,無符號數(shù),消息的類型,準備接收為5。
[0038] fid :64bit,無符號數(shù),確認已經(jīng)被接收的文件的唯一標識符。
[0039] 出錯時的回復消息格式如下:
[0040] type, fid, code
[0041] type :8bit,無符號數(shù),消息的類型,出錯消息為6。
[0042] fid :64bit,無符號數(shù),接收出錯的文件的唯一標識符。
[0043] code :8bit,無符號數(shù),出錯原因代碼。具體如下表:
[0044]
[0045] 下面著重對壓縮編碼的生成方法和文件解壓進行說明,例如原文件名為a. txt,二 進制文件的字節(jié)內容是abccab,壓縮步驟如下:
[0046] 1.接收端初始化編碼樹,該樹只有一個空葉節(jié)點,符號為TERM,權值始0,編號為 1024,說明書附圖1中的a是執(zhí)行該步驟后的編碼樹。
[0047] 2.讀取第一個字節(jié)為a,因為樹中沒有字符a,所以a的編碼是從樹根節(jié)點定位到 TERM節(jié)點的編碼加上字符a本身,因為只有一個TERM節(jié)點,所以a的編碼就是a,寫入壓 縮編碼a。然后生成一棵子樹,用這棵子樹代替原來的TERM結點,該子樹的父節(jié)點符號為 空,編號為TERM原來的編號1024,其右分支節(jié)點為字符為a,權值為1,編號為現(xiàn)在父節(jié)點編 號減去1即1023,左分支節(jié)點為一個新的空葉結點TERM,編號為現(xiàn)在父節(jié)點編號減去2即 1022。雖然根節(jié)點的權值進行了增加,但是該節(jié)點編號是最大的,所以不做任何交換動作, 最后修改節(jié)點權值為1 (TERM的權值0加上節(jié)點a的權值1),說明書附圖1中的b是執(zhí)行該 步驟后的編碼樹。
[0048] 3.讀取第二個字節(jié)b,樹中沒有字符b,從根節(jié)點到TERM節(jié)點的路徑編碼加上b字 符本身就是字符b的編碼,寫入壓縮編碼Ob。使用包含新TERM節(jié)點和字符b替代舊的TERM 節(jié)點,并根節(jié)點的權值加1。說明書附圖1中的c是執(zhí)行該步驟后的編碼樹。
[0049] 4.讀取第三個字節(jié)c,樹中沒有字符c,寫入c的編碼為00c。使用包含新TERM節(jié) 點和字符b替代舊的TERM節(jié)點,說明書附圖1中的d是執(zhí)行該步驟后的編碼樹,此時需要 對編號為1022的節(jié)點的權值進行加1操作,但是此時與編號為1022的節(jié)點權值相同的塊 有1023,1021,1019,其中1023最大,所以需要將1022與1023進行交換,對權值進行加1 處理,然后將1023的父節(jié)點作為當前節(jié)點,因為是根節(jié)點,所以直接將根節(jié)點的權值加1即 可,說明書附圖1中的e是執(zhí)行該步驟后的編碼樹。
[0050] 5.讀取第4個字節(jié)c,樹中有字符c,寫入c的編碼為101,將要對1019節(jié)點的權 值加1,此時與1019權值相同的節(jié)點有1021和1022,最大編號是1022,所以需要交換1022 和1019,交換后對編號為1022的節(jié)點權值進行加1處理,然后將1022的父節(jié)點作為當前節(jié) 點,因為是根節(jié)點,所以直接將根節(jié)點的權值加1即可,說明書附圖1中的f是執(zhí)行該步驟 后的編碼樹。
[0051] 6.讀取第5個字節(jié)a,樹中有字符a,寫入a的編碼為101,將要對1019節(jié)點的權 值加1,此時與1019權值相同的節(jié)點有1021,而且1021大于1019,所以需要交換1021和 1019,交換后對編號為1021的節(jié)點權值進行加1處理,說明書附圖1中的g是執(zhí)行該步驟后 的編碼樹,然后需要調整1021的父節(jié)點1023的權值,因為與1023權值2相同的塊有1022, 但是1022小于1023,所以不進行交換,將1023的權值加1變成3,下面需要調整1024的權 值,因為是根節(jié)點,所以直接將權值加1,變成5,說明書附圖1中的h是執(zhí)行該步驟后的編 碼樹。
[0052] 7.讀取第6個字節(jié)b,樹中有字符b,寫入b的編碼為101,將要對1019的節(jié)點權 值加1,此時沒有與1019權值1相同的塊,不需要進行交換,直接將1019節(jié)點的權值加1變 成2,然后將要對1020節(jié)點的權值加1,此時沒有與1020節(jié)點權值1相同的塊,不需要進行 交換,直接將1020節(jié)點的權值加1變成2,然后將對1023節(jié)點的權值加1,此時沒有與1023 權值一樣的塊,不需要進行交換,直接將1023節(jié)點的權值加1變成4,然后將要對1024節(jié)點 的權值加1,因為是根節(jié)點,所以直接加1變成6。說明書附圖1中的i是執(zhí)行該步驟后的 編碼樹。
[0053] 8?最終abccab的壓縮編碼是:a0b00cl01101101,文件名為a. txt. gmf。原來存儲 這個文件需要使用48bit,通過壓縮后只需要36bit。
[0054] 對壓縮文件進行解壓縮,期望生成的原文件二進制內容為:abccab,解壓文件的步 驟如下:
[0055] 1.讀取壓縮文件的原始文件大小為6個字節(jié),原始文件名為a. txt,通過原始文件 名創(chuàng)建原始空文件。
[0056] 2.初始化編碼樹,該樹只有一個空葉節(jié)點,符號為TERM,權值始0,編號為1024,說 明書附圖1中的a是執(zhí)行該步驟后的編碼樹。
[0057] 3.讀取壓縮編碼中的第一個字節(jié),為字符a,寫入原始文件,然后將字符a加入到 樹中,方法與壓縮時的相同,說明書附圖1中的b是執(zhí)行該步驟后的編碼樹。
[0058] 4。讀取壓縮編碼中的一位0,到達TERM節(jié)點,然后從壓縮編碼中讀取一個字節(jié),為 字符b,將字符b寫入原始文件,將字符b加入到樹中,說明書附圖1中的c是執(zhí)行該步驟后 的編碼樹。
[0059] 5.讀取壓縮編碼中的一位0,到達1022,再讀取壓縮編碼中的一位0,到達TERM,然 后從壓縮編碼中讀取一個字節(jié),為字符c,將字符c寫入原始文件,將字符c加入到樹中,說 明書附圖1中的e是執(zhí)行該步驟后的編碼樹。
[0060] 6.讀取壓縮編碼中的位101,最終到達1019節(jié)點,該節(jié)點字符為c,將c寫入原始 文件,將1019節(jié)點的權值加1,說明書附圖1中的f是執(zhí)行該步驟后的編碼樹。
[0061] 7.讀取壓縮編碼中的位101,最終到達1019節(jié)點,該節(jié)點字符為a,將a寫入原始 文件,將1019節(jié)點的權值加1,說明書附圖1中的h是執(zhí)行該步驟后的編碼樹。
[0062] 8.讀取壓縮編碼中的位101,最終到達1019節(jié)點,該節(jié)點字符為b,將b寫入原始 文件,將1019節(jié)點的權值加1,說明書附圖1中的i是執(zhí)行該步驟后的編碼樹。
[0063] 9.最終完成解壓縮操作,原文件二進制內容為abccab,與預期的一致。 圖1是文件壓縮和解壓縮過程中出現(xiàn)的各種編碼樹變換圖。 圖1中a是初始的只包含一個空節(jié)點的編碼樹; 圖1中b是加入字符a節(jié)點后的編碼樹; 圖1中c是加入字符b節(jié)點后的編碼樹; 圖1中d是加入字符c節(jié)點后的編碼樹; 圖1中e是加入字符c節(jié)點后權值進位后的編碼樹; 圖1中f是再次加入字符c節(jié)點后的編碼樹; 圖1中g是再次加入字符a節(jié)點后的編碼樹; 圖1中h是再次加入字符a節(jié)點后權值進位后的編碼樹; 圖1中i是再次加入字符b節(jié)點后的編碼樹。 四、【具體實施方式】
[0064] 1.配置TCP/IP網(wǎng)絡,并且網(wǎng)絡上兩端能互通。
[0065] 2.在網(wǎng)絡的一端啟動發(fā)送端,在網(wǎng)絡的另一端啟動接收端。
[0066] 3.發(fā)送端發(fā)送文件,接收端能產生壓縮文件。
【主權項】
1. 本發(fā)明在文件傳輸過程中使用可變樹對傳輸?shù)奈募?shù)據(jù)進行編碼,因此要求保護使 用可變樹的方式對網(wǎng)絡傳輸中的文件進行編碼。2. 本發(fā)明在文件傳輸過程中壓縮時采用雙通道TCP連接控制,一個通道傳輸控制指 令,一個通道傳輸文件數(shù)據(jù),因此要求保護在文件傳輸過程中使用雙通道TCP連接實現(xiàn)邊 傳輸邊壓縮的設計方法。
【文檔編號】G06F17/30GK105893358SQ201410464824
【公開日】2016年8月24日
【申請日】2014年9月12日
【發(fā)明人】陳宏慶, 顧永青
【申請人】江蘇國貿醞領智能科技股份有限公司