1

我正在使用 Perl v5.22.1、2.53_01StorableIO::Uncompress::Gunzip2.068。

我想使用 PerlStorable在内存中压缩文件,而不使用中间文件。

我有一个$zip_file = '/some/storable.gz'指向这个压缩文件的变量。

如果我直接压缩到一个文件,这工作正常,并且%root正确设置为Storable哈希。

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

但是,如果我像这样压缩到内存中:

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

我得到错误

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

所以 Storable 的神奇数字已经被扼杀:它永远不应该那么高。

但是,解压缩缓冲区中的字符串仍然是正确的;缓冲区以pst正确的Storable标头开头。它似乎只是被破坏的整数之类的多字节变量。

这是否与字节顺序有关,例如写入文件以一种方式工作,而写入文件缓冲区则以另一种方式工作?如何在不破坏整数的情况下将其压缩到缓冲区?

4

1 回答 1

4

这与解压缩无关,而是与使用retrievevs. thaw. 他们都期望不同的输入,即thaw期望来自的输出,freezeretrieve期望来自的输出store。这可以通过一个简单的测试来验证:

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

在我的机器上,这为由创建的文件提供 24 个store字节,为freeze. 如果我从file.store文件中删除前4个字节相当于file.freeze,即存储只是添加了一个4字节的标题。因此,您可能会尝试在内存中解压缩文件,删除前 4 个字节并thaw在其余部分上运行。

于 2016-08-12T08:02:16.733 回答