2014-11-09 6 views
1

원시 파티션 이미지 (EXT4)의 여유 공간에서 정크 데이터 만 추출하고 싶습니다. 그래서 여유 공간을 제로화 한 다음 그 결과를 가면으로 사용하는 아이디어가 있습니다.Perl에서 파일을 다른 마스크로 읽을 때 음수 마스크로 파일을 사용하는 방법은 무엇입니까?

데이터 및 여유 공간과 같은 원시 파티션 이미지가 포함 된 원시 분할 이미지 (14GB)가 있으며 여유 공간이 0입니다.

Perl에서이 두 파일 사이에서 다음 작업을 수행하려고합니다. 처리 할 원시 파티션 이미지를 얻기 위해 각 바이트에 대해 여유 공간의 정크 데이터 만 포함합니다. RPM & !RPMz => RPMp

사람이 펄 스크립트 또는이를위한 출발점 좀 도와 수 : 각 바이트에 대한

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 

?

+0

* 모든 * Perl을 아십니까? – Borodin

+0

조금. 나는 청크 읽기를 염두에두고 있지만,이 순간에는 청크에서 각 바이트를 추출하는 방법을 모릅니다. 실제로 이것은 압축을 풀지 만 느리다 : unpack ("x [$ pos] H2", $ buffer); 나는 다른 시나리오에서 그것을 사용했다. – Nick

+0

논리 연산자'&','|','~'및'^'[전체 문자열에서 비트 단위로 작업] (http://perldoc.perl.org/perlop.html#Bitwise-String) - 오페라)가 당신을 방해하지 않을까요? – Borodin

답변

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

마침내 누군가가 이것을 제안했는데, 이것은 매우 빠릅니다. cat mmcblk0p12.raw | tr '\ 377' '\ 001'| tr '\ 000' '\ 377'| tr '\ 001- \ 376' '\ 000'> mmcblk0p12_invert.raw – Nick