如何在使用Perl在大端上工作的小端生成SDBM文件(.dir和.pag)?

时间:2013-10-01 15:48:51

标签: perl endianness

问题已更新20131001:

我的任务是研究更新使用SDBM_File生成包含Apache重定向的SDBM文件(.dir和.pag)的Perl进程。目标服务器是big endian,源服务器是little endian。目标服务器无法以任何方式更新,所以我试图弄清楚如何在发送它们之前在源服务器上转换这些文件。

处理'endianness'对我来说是新的,但我已经想出如何解压缩/打包各种类型的数据,严重依赖本教程: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);

1 个答案:

答案 0 :(得分:0)

将源转储到ASCII - &gt;复制到目标 - &gt;从ASCII构建新的sdbm文件。