Thread gesamte festplatte als datei
(4 answers)
Opened by attax at 2010-11-23 07:30
Man arbeitet bei großen Binärdaten mit "chunks".
als Beispiel (ungetestet): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 #!/usr/bin/perl use strict; use warnings; my $file='data.dat'; my $img_file='/tests/image%05u.jpg'; my $chunksize=1024; #byte open(my $fh, '<', $file) or die("ERROS open $file, ($!)\n"); binmode($fh); my $chunk=''; my $data=''; my $img=''; my $img_count=0; while(read($fh,$chunk,$chunksize)) { # wenn gerade kein Bild gelesen wird, # dann nach einem Bildanfang suchen if(!$img) { # den letzten gelesen chunk mit dem neuen Kombinieren, # damit man Überschneidungen erkennt. $data.=$chunk; # jpeg Anfang $img=$1 if($chunk=~/(\xFF\xD8.+)$/s); $data=$chunk; $chunk=''; } # es wurde ein Bildanfang gefunden # ("\xFF\xD8") ist auf jeden Fall "wahr", # und das muss im String stehen if($img) { # den aktuellen chunk hinzu # darum habe ich $chunk oben gelehrt. # wenn ein Bild vollständig in einem chunk ist, # würde es Sonst zu Problemen kommen $img.=$chunk; # jpeg ende if($img=~/^(.+?\xFF\xD9)/s) { # Restdaten, # die noch ein Bildanfang enthalten können $data=$'; # heraus geschnittene Bilddaten $img=$1; # Bildnamen erzeugen und speichern my $img_name=sprintf($img_file,$img_count); $img_count++; if(open(my $ifh, '>', $img_name)) { binmode($ifh); print $ifh $img; close($ifh); } else { warn ("ERROR open $img_name ($!)\n"); } # Bildstring leeren, damit die Suche wieder beginnt $img=''; } } } close($fh); Aber willst du das ernsthaft so machen, muss ich dir davon abraten. Erstens wirst du mit so einem primitiven suche ach andere Daten als Bilder bekommen (\xFF\xD9 und \xFF\xD8) sind wirklich nicht einzigartige Zeichenketten. Zweitens ist Perl in der Beziehung nicht besonders schnell und Regexps brauchen auch ihre Zeit. (Du könntest die regulären Ausdrücke durch eine Kombination "index" und "substr" ersetzen und die Geschwindigkeit verdoppeln) Drittens gibt es einige sehr gute Tools die so was für dich übernehmen gut getestet und um einiges schneller sind. |