在Perl中如何使用文件作为负面掩码来读取另一个文件?

时间:2014-11-09 21:13:56

标签: perl disk-partitioning ext4

我想从原始分区图像(EXT4)的可用空间中仅提取垃圾数据。 所以我得到了这个想法,将可用空间归零,然后将结果用作掩码。

我有原始分区图像(14GB),包含数据和可用空间以及相同的原始分区图像,可用空间归零。

我想在Perl中的这两个文件之间进行以下操作,对于它们的每个字节,为了获得处理的原始分区图像,将只包含来自可用空间的垃圾数据。

RPM  - raw partition image
RPMz - raw partition image with free space zeroed
RPMp - raw partition image processed, will contain only junk data from free space
每个字节

RPM & !RPMz => RPMp

有人可以帮我解决Perl脚本或起点吗?

1 个答案:

答案 0 :(得分:1)

这是我为反转字节而写的,以获得!RPMz。但它很慢,而且有100MB的块我记忆力不足。我需要一些帮助。

use strict;
use warnings;
use bignum;

my $buffer = "";

my $path1="F:/data-lost-workspace/partition-for-zerofree/mmcblk0p12.raw";
my $path2="F:/data-lost-workspace/partition-for-zerofree/mmcblk0p12_invert.raw";

open(FILE_IN, "<$path1");
binmode(FILE_IN); 

my $offset=0;
my $remaining = -s $path1;
my $length=1024*1024*100;
my $index=1;

unlink $path2;

while($remaining>0)
{
my $line=read(FILE_IN, $buffer, $length);  
print $index." ".$line."\r\n";
$index++;
$remaining=$remaining-$length;

my $buffer_invert=();

my @c = split('', $buffer);

for(my $i=0;$i<$length;$i++)
{
    if(ord($c[$i])==0x0)
    {
        $c[$i]=chr(0xFF);
    }
    else
    {
        $c[$i]=chr(0x00);
    }
}

$buffer_invert=join('', @c);

open(FILE_OUT, ">>$path2");
binmode(FILE_OUT); 
print FILE_OUT $buffer_invert;
close(FILE_OUT);
}
close(FILE_IN);