2014-11-09 10 views
1

Я хочу извлечь только ненужные данные из свободного пространства изображения необработанного раздела (EXT4). Итак, я получил эту идею, чтобы обнулить свободное пространство, а затем использовать результат как маску.Как использовать файл как отрицательную маску для чтения другого файла, в Perl?

У меня есть необработанное изображение раздела (14 ГБ), содержащее данные и свободное пространство и одно и то же изображение исходного раздела, с нулевым свободным пространством.

Я хочу сделать следующую операцию между этими двумя файлами в 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 или отправную точку для этого?

+0

Знаете ли вы * any * Perl? – Borodin

+0

немного. Я имею в виду чтение куска, но в этот момент я не знаю, как извлечь каждый байт из куска, например. Фактически это будет извлекать его, но это медленно: распаковать («x [$ pos] H2», $ buffer); Я использовал его в другом сценарии. – Nick

+0

Итак, если бы я сказал вам, что логические операторы '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' -Операторы), которые помогут вам? – Borodin

ответ

1

Это то, что я написал для инвертирования байтов, чтобы получить! RPMz. Но он медленный, и с кусочками 100 Мб у меня не хватает памяти. Мне нужна помощь.

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); 
+0

Наконец-то кто-то предложил это, что довольно быстро: cat mmcblk0p12.raw | tr '\ 377' '\ 001' | tr '\ 000' '\ 377' | tr '\ 001- \ 376' '\ 000'> mmcblk0p12_invert.raw – Nick

 Смежные вопросы

  • Нет связанных вопросов^_^