问题更新 20131001:
我的任务是研究更新使用 SDBM_File 生成包含 Apache 重定向的 SDBM 文件(.dir 和 .pag)的 Perl 进程。目标服务器为大端,源服务器为小端。目标服务器无法以任何方式更新,因此我试图弄清楚如何在源服务器上转换这些文件,然后再发送它们。
处理“字节顺序”对我来说是新事物,但我已经弄清楚如何解压/打包各种类型的数据,严重依赖本教程: http: //perldoc.perl.org/perlpacktut.html
经过一番挖掘,我的主要方法涉及弄清楚如何将生成的二进制文件(例如 .pag 文件)转换为可在目标服务器上使用的格式。经过一番修修补补,我意识到如果我什至无法在源计算机上复制原始二进制文件,我就不应该尝试为目标进行转换。在下面的代码中,我只是试图将数据从一个二进制文件解压缩并打包到另一个二进制文件中。如果我能做到这一点,我认为使用另一个模板导出它会很容易。感谢您的帮助 - 我正在 64 位 iOS 机器上测试以下内容。
#!/usr/bin/perl
use Fcntl; # For O_RDWR, O_CREAT, etc.
use SDBM_File;
use Config;
use Data::Dumper;
#notes: to see the octal dump with the hex option from command line od -x packtest.pag
# byte info
print "Byteorder: $Config{ byteorder }\n";
print unpack("h*", pack("s2", 1, 2)), "\n";
# '10002000' on e.g. Intel x86 or Alpha 21064 in little-endian mode
# '00100020' on e.g. Motorola 68040
print "00100020 is big-endian\n";
tie(%h, 'SDBM_File', 'packtest', O_RDWR|O_CREAT, 0666)
or die "Couldn't tie SDBM file 'filename': $!; aborting";
# Add some data to the hash - will be used for Apache redirects
$h{'/from.html'} = '/to.html';
print "Before conversion: \n";
print Dumper(\%h);
#do I need to make sure it's packed in a certain way?
#%h = pack "q", %h;
untie %h;
#new file
my $data_file="packtest.pag";
open(IN, '<:raw', $data_file);
my $before = <IN>;
close(IN);
#my $after = $before;
my $tmp_after = unpack "Q", $before;
my $after = pack "Q", $tmp_after;
#http://stackoverflow.com/questions/4672213/pack-unpack-litle-endian-64bit-question
print "After: \n";
print Dumper(\$after);
my $new_file="packtest2.pag";
open(OUT,'>:raw',$new_file) || die "error $!\n";
print OUT $after;
close(OUT);