2016-08-12 1 views
0

perl gunzip zu puffern und gunzip haben unterschiedliche Bytereihenfolgen

Ich benutze Perl v5.22.1, 2,068 Storable 2.53_01 und IO::Uncompress::Gunzip einzureichen.

Ich möchte Perl verwenden, um eine Storable Datei in den Speicher zu gunzip, ohne eine Zwischendatei zu verwenden.

Ich habe eine Variable $zip_file = '/some/storable.gz', die auf diese gezippte Datei zeigt.

Wenn ich direkt in eine Datei gimpzip, funktioniert das gut, und %root ist korrekt auf die Storable Hash festgelegt.

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

Allerdings, wenn ich gunzip in den Speicher wie folgt aus:

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

ich den Fehler

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

so die speicherbare die magische Zahl abgeschlachtet wurde erhalten: es sollte nie sei so hoch.

Die Zeichenfolgen in dem entpackten Puffer sind jedoch immer noch korrekt; Der Puffer beginnt mit pst, das ist der korrekte Storable Header. Es scheint nur Multi-Byte-Variablen wie ganze Zahlen zu sein, die gebrochen werden.

Hat dies etwas mit der Byte-Reihenfolge zu tun, so dass das Schreiben in eine Datei in einer Weise funktioniert, während das Schreiben in einen Dateipuffer in einer anderen funktioniert? Wie kann ich in einen Puffer packen, ohne dass es meine ganzen Zahlen ruiniert?

Antwort

3

Das ist nicht im Zusammenhang mit unzip, sondern mit retrieve vs thaw. Beide erwarten unterschiedliche Eingaben, d. H. thaw erwarten die Ausgabe von freeze, während retrieve die Ausgabe von store erwartet. Dies kann mit einem einfachen Test überprüft werden:

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

Auf meinem Rechner gibt dieses 24 Bytes für die Datei von store und 20 Bytes für freeze erstellt. Wenn ich die führenden 4 Bytes von file.store entferne, entspricht die Datei file.freeze, d. H. Speicher hat gerade einen 4-Byte-Header hinzugefügt. So könnten Sie versuchen, die Datei im Speicher zu entpacken, die führenden 4 Bytes zu entfernen und thaw auf dem Rest auszuführen.

+0

Ausgezeichnete Antwort – Borodin

+0

Das war richtig! Leider habe ich die Storable-Dateien nicht erstellt, so dass ich nicht wählen kann, Freeze statt Store zu verwenden. Ich fand jedoch, dass es immer noch möglich ist, einen "Speicher" im Speicher abzurufen, indem $ file in ein Datei-Handle umgewandelt wird: 'öffne meine $ fake_fh, <<,> $ file;' und dann 'fd_retrieve ($ fake_fh);' – Miguel

Verwandte Themen