2012-05-17 27 views
0

我知道gzip和其他壓縮例程使用字節級重複數據刪除操作。我只是想知道是否有像下半場gzip一樣的標準例程。根據當前文本壓縮修訂歷史

具體來說,對於修訂歷史。當前的文本將是簡單的,並且以前的修訂版本將處於壓縮的blob中。有沒有辦法將當前的plain設置爲壓縮的起始文本,而實際上並不包含壓縮結果中的當前文本。因此,壓縮文本和啓動文本將一起用於解壓縮。

我對Java,Perl,Node.JS感興趣,我想C/C++,因爲有方法使用上述語言之一調用編譯的文件。在這種情況下,我將在UNIX上構建C文件。

這樣的例程是否存在,是否有一個重要的/可用的多種語言?

+0

還研究如何git做增量壓縮。 – daxim

回答

1

使用郵編,你可以包括2個單獨的文件,而不是壓縮其中的一個

我知道Java有與zip文件做的東西設施

+0

第二個文件是否將第一個文件用作壓縮的參考?例如,一個完全隨機的文件(意思是它不能被壓縮)是「當前版本」,那麼以前的版本將被寫入歷史。如果之前的版本幾乎完全相同,則應該只佔用最小的空間,因爲它是基於當前「未壓縮」的版本進行重複數據刪除的。我的第一印象是,你的解決方案將分離當前和以前的修訂,而實際上不允許以前的「基於」當前。 –

0

有沒有一種方法來設置當前平原作爲 壓縮的起始文本,而實際上並未包含 壓縮結果中的當前文本。

有兩種方法。您可以使用zlibdeflateSetDictionary()向壓縮機提供高達32K的歷史記錄,壓縮機將使用它壓縮饋送給它的壓縮機。 32K不包含在壓縮數據中,解壓縮程序會要求32K可用於解壓成功。

也許更有效,特別是對於長度超過32K的文本,將使用Unix diff來生成修訂和當前文本之間的差異,並壓縮diff的結果。您可以連續執行diff的多個版本,並將其全部壓縮。

+0

差異是否足以讓我重新創建以前的版本? –

+0

如果是文本,diff/patch應該恢復原始文件。您需要小心選項,因爲可以通過diff來忽略某些類型的更改,例如只在空白處改變。 –

+0

如果你想要一些真正無損的東西,無論輸入是文本還是二進制,你都需要使用第一種方法,即使用壓縮字典。 –