2016-08-12 76 views
0

perl的gunzip把緩衝和gunzip把文件中有不同的字節順序

我使用Perl v5.22.1,Storable 2.53_01和IO::Uncompress::Gunzip 2.068。

我想使用Perl來在內存中gunzip一個Storable文件,而不使用中間文件。

我有一個變量$zip_file = '/some/storable.gz'指向這個壓縮文件。

如果我直接gunzip到一個文件,這工作正常,並且%root正確設置爲Storable散列。

gunzip($zip_file, '/home/myusername/Programming/unzipped'); 
my %root = %{retrieve('/home/myusername/Programming/unzipped')}; 

但是,如果我用gunzip到內存中是這樣的:

my $file; 
gunzip($zip_file, \$file); 
my %root = %{thaw($file)}; 

我得到的錯誤

Storable binary image v56.115 more recent than I am (v2.10)` 

所以可存儲的幻數已屠殺:它永不那麼高。

但是,解壓縮緩衝區中的字符串仍然正確;緩衝區以pst開頭,這是正確的Storable標題。它似乎只是像正在被破壞的整數那樣的多字節變量。

這是否與字節排序有關,例如在寫入文件緩衝區時寫入文件的方式是一種方式,而在另一種方式中寫入文件緩衝區的方式是?如何在不破壞我的整數的情況下將gunzip緩衝到緩衝區?

回答

3

這與解壓縮無關,但使用retrieve而不是thaw。他們都期望有不同的輸入,即thaw期望freeze的輸出,而retrieve期望store的輸出。 這可以用一個簡單的測試來驗證:

$ perl -MStorable -e 'my $x = {}; store($x,q[file.store])' 
$ perl -MStorable=freeze -e 'my $x = {}; print freeze($x)' > file.freeze 

在我的機器這給24個字節,以供store和20字節freeze創建的文件。如果我從file.store中刪除前4個字節,則該文件相當於file.freeze,即商店剛添加了4個字節的標題。因此,您可能會嘗試解壓縮內存中的文件,刪除前4個字節,並在其餘部分運行thaw

+0

優秀答案 – Borodin

+0

這是對的!不幸的是,我沒有創建可存儲的文件,所以我無法選擇使用凍結而不是存儲。然而,我發現通過將$ file轉換爲文件句柄,可以檢索'store'存儲在內存中:'open my $ fake_fh,「<」,\ $ file;'然後使用'fd_retrieve($ fake_fh);' – Miguel