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 个像整数这样的变量被破坏了。
这是否与字节顺序有关,例如写入文件以一种方式工作,而写入文件缓冲区以另一种方式工作?如何在不破坏我的整数的情况下压缩到缓冲区?
这与解压缩无关,而是与使用 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
在我的机器上,这为 store
创建的文件提供了 24 个字节,为 freeze
创建的文件提供了 20 个字节。如果我从 file.store
中删除前导 4 个字节,则该文件相当于 file.freeze
,即存储刚刚添加了一个 4 字节 header。因此,您可能会尝试在内存中解压缩文件,删除前 4 个字节和 运行 thaw
其余部分。
我正在使用 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 个像整数这样的变量被破坏了。
这是否与字节顺序有关,例如写入文件以一种方式工作,而写入文件缓冲区以另一种方式工作?如何在不破坏我的整数的情况下压缩到缓冲区?
这与解压缩无关,而是与使用 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
在我的机器上,这为 store
创建的文件提供了 24 个字节,为 freeze
创建的文件提供了 20 个字节。如果我从 file.store
中删除前导 4 个字节,则该文件相当于 file.freeze
,即存储刚刚添加了一个 4 字节 header。因此,您可能会尝试在内存中解压缩文件,删除前 4 个字节和 运行 thaw
其余部分。