perl gunzip to buffer 和 gunzip to file 有不同的字节顺序

perl gunzip to buffer and gunzip to file have different byte orders

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

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

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

如果我直接 gunzip 到一个文件,这工作正常,并且 %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 header。似乎只有 multi-byte 个像整数这样的变量被破坏了。

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

这与解压缩无关,而是与使用 retrievethaw 相关。他们都期望不同的输入,即 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

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