我有两个大小相等的二进制文件,但不是值.我使用unpack如下,但结果很奇怪.
当我使用"大"二进制文件时,两个输出都显示部分结果:
一个二进制文件开始好坏 -
第二个二进制文件在开始时出错.
你认为哪里可能是弱点?
open(BIN_FILE1, "<bin_files/BINF1.bin") or die("Cannot open file for writing");
open(BIN_FILE2, "<bin_files/BINF2.bin") or die("Cannot open file for writing");
binmode(BIN_FILE1);
binmode(BIN_FILE2);
# N An unsigned long (32-bit) in "network" (big-endian) order.
my @values_tmp1 = unpack("N*", <BIN_FILE1>);
my @values_tmp2 = unpack("N*", <BIN_FILE2>);
close (BIN_FILE1);
close (BIN_FILE2);
my $tmp_bin1 = @values_tmp1;
my $tmp_bin2 = @values_tmp2;
print "\nBIN FILE1 LENGTH: ",$tmp_bin1,"\n";
print "\nBIN FILE2 LENGTH: ",$tmp_bin2,"\n";
Run Code Online (Sandbox Code Playgroud)
输出是:
BIN FILE1 LENGTH:1203
BIN FILE2 LENGTH:124
输入文件是:
-rw-rw-r-- 1 yodar yodar 9600 2009-12-23 19:59 BINF1.bin
-rw-rw-r-- 1 yodar yodar 9600 2009-12-27 16:38 BINF2.bin
Run Code Online (Sandbox Code Playgroud)
如果有另一种简单而安全的方法将二进制文件数据收集到数组中,我将很高兴知道.
我怀疑你没有读取整个文件(<>操作员尝试读取记录,使用记录分隔符$ /默认为换行符).尝试将读取更改为以下内容:
{
# Enable slurp mode
local $/;
my @values_tmp1 = unpack("N*", <BIN_FILE1>);
my @values_tmp2 = unpack("N*", <BIN_FILE2>);
}
Run Code Online (Sandbox Code Playgroud)
你说你有"大"文件.看起来它们并不是那么大,并且很容易适应记忆.
但是,如果您的文件太大而无法同时存储在内存中,则可以使用read或sysread以块的形式读取数据.
示例 - 一次读入4000个字节:
my $file_path = 'bin_files/BINF1.bin';
open my $fh, '<:encoding(raw)', $file_path
or die "Cannot open file '$file_path' for reading";
my $buffer;
while ( my $got = read( $fh, $buffer, 4000 ) ) {
warn "Read $got bytes from file\n."
my @integers = unpack "N*", $buffer;
do_stuff( \@integers );
$buffer = '';
}
Run Code Online (Sandbox Code Playgroud)
使用open带有词法句柄的3参数,可以避免某些安全性和可维护性问题.3 arg open还允许您在mode标志中指定文件编码.这样你就不需要调用binmode了.