【问题标题】:perl gunzip to buffer and gunzip to file have different byte ordersperl gunzip to buffer 和 gunzip to file 有不同的字节顺序
【发布时间】:2016-08-12 07:39:46
【问题描述】:

我正在使用 Perl v5.22.1、Storable2.53_01 和 IO::Uncompress::Gunzip2.068。

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

我有一个变量$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 标头。它似乎只是被破坏的整数等多字节变量。

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

【问题讨论】:

    标签: gzip gunzip perl storable


    【解决方案1】:

    这与解压缩无关,而是与使用 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,即 store 刚刚添加了一个 4 字节标题。因此,您可能会尝试在内存中解压缩文件,删除前 4 个字节,然后在其余部分运行 thaw

    【讨论】:

    • 这是对的!不幸的是,我没有创建可存储文件,所以我无法选择使用冻结而不是存储。但是我发现仍然可以通过将 $file 转换为文件句柄来检索内存中的store Storable:open my $fake_fh, "<", \$file;,然后使用fd_retrieve($fake_fh);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多