Thread gesamte festplatte als datei (4 answers)
Opened by attax at 2010-11-23 07:30

topeg
 2010-11-23 08:38
#142994 #142994
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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.

View full thread gesamte festplatte als datei