Ich muss die Binärdatei in ASCII-Werte konvertierenPerl verwenden, das ich zur Verarbeitung weiter analysieren muss. Ich habe etwas recherchiert und den Code gefunden. Ich kann es einwandfrei funktionieren lassen, aber den Code nicht vollständig verstehen. Kann jemand es bitte aufschlüsseln und es Zeile für Zeile erklären? PS: Ich verstehe die meisten Zeilen, aber ich bin besonders besorgt über den Teil, in dem die eigentliche Binärdatei in ASCII konvertiert wird. Vielen Dank.
foreach $file(@ARGV)
{
$size= -s $file;
my $form= length(sprintf("%x",$size))-1;
++$form unless $form;
print "File: ",$file,"n";
open (IN,$file);
while (my $rb= read(IN, $buf, 16))
{
my @x= unpack("H2" x $rb, $buf);
$buf=~ s/[x00-x1fx7f-xff]/./g;
$buf.= " " x (16-length($buf));
print $fw ("%0${form}x0: %s [%s]n"
,$i++,
,sprintf (" %s %s %s %s %s %s %s %s - %s %s %s %s %s %s %s %s", @x)
,$buf);
}
close (IN)
}
Antworten:
2 für die Antwort № 1Ich denke dein Problem liegt bei unpack
Anruf. Ich habe es leicht geändert
my @x = unpack "(H2)*", $buf
Der Formatbezeichner (H2)*
sagt, jedes Byte des Strings im zweiten Parameter in eine zweistellige Hex-Zahl umzuwandeln. Das *
bedeutet nur so viele Bytes zu konvertieren wie im String
Das wird für Sie richtig funktionieren
use strict;
use warnings "all";
use POSIX "ceil";
for my $file (@ARGV) {
my $size = 16 * ceil( (-s $file) / 16);
my $form = length sprintf "%x", $size-1;
$form ||= 1;
print "File: $filen";
open my $fh, "<", $file or die $!;
my $i = 0;
while ( my $rb = read $fh, my $buf, 16 ) {
my @x = unpack "(H2)*", $buf;
push @x, " " until @x == 16;
$buf =~ tr/x20-x7E/./c;
$buf .= " " x (16 - length($buf));
printf "%0*x: %s [%s]n",
$form,
$i++,
sprintf( "%s %s %s %s %s %s %s %s - %s %s %s %s %s %s %s %s", @x ),
$buf;
}
print "n";
}
Ausgabe
Hier wird es selbst abgeladen
File: E:Perlsourcehexdump.pl
000: 75 73 65 20 73 74 72 69 - 63 74 3b 0a 75 73 65 20 [use strict;.use ]
001: 77 61 72 6e 69 6e 67 73 - 20 71 77 2f 20 61 6c 6c [warnings qw/ all]
002: 20 46 41 54 41 4c 20 2f - 3b 0a 0a 75 73 65 20 50 [ FATAL /;..use P]
003: 4f 53 49 58 20 27 63 65 - 69 6c 27 3b 0a 0a 40 41 [OSIX "ceil";..@A]
004: 52 47 56 20 3d 20 24 30 - 3b 0a 0a 66 6f 72 20 6d [RGV = $0;..for m]
005: 79 20 24 66 69 6c 65 20 - 28 40 41 52 47 56 29 20 [y $file (@ARGV) ]
006: 7b 0a 0a 20 20 20 20 6d - 79 20 24 73 69 7a 65 20 [{.. my $size ]
007: 3d 20 31 36 20 2a 20 63 - 65 69 6c 28 20 28 2d 73 [= 16 * ceil( (-s]
008: 20 24 66 69 6c 65 29 20 - 2f 20 31 36 29 3b 0a 0a [ $file) / 16);..]
009: 20 20 20 20 6d 79 20 24 - 66 6f 72 6d 20 3d 20 6c [ my $form = l]
00a: 65 6e 67 74 68 20 73 70 - 72 69 6e 74 66 20 27 25 [ength sprintf "%]
00b: 78 27 2c 20 24 73 69 7a - 65 2d 31 3b 0a 20 20 20 [x", $size-1;. ]
00c: 20 24 66 6f 72 6d 20 7c - 7c 3d 20 31 3b 0a 0a 20 [ $form ||= 1;.. ]
00d: 20 20 20 70 72 69 6e 74 - 20 22 46 69 6c 65 3a 20 [ print "File: ]
00e: 24 66 69 6c 65 5c 6e 22 - 3b 0a 20 20 20 20 6f 70 [$filen";. op]
00f: 65 6e 20 6d 79 20 24 66 - 68 2c 20 27 3c 27 2c 20 [en my $fh, "<", ]
010: 24 66 69 6c 65 20 6f 72 - 20 64 69 65 20 24 21 3b [$file or die $!;]
011: 0a 0a 20 20 20 20 6d 79 - 20 24 69 20 3d 20 30 3b [.. my $i = 0;]
012: 0a 20 20 20 20 77 68 69 - 6c 65 20 28 20 6d 79 20 [. while ( my ]
013: 24 72 62 20 3d 20 72 65 - 61 64 20 24 66 68 2c 20 [$rb = read $fh, ]
014: 6d 79 20 24 62 75 66 2c - 20 31 36 20 29 20 7b 0a [my $buf, 16 ) {.]
015: 0a 20 20 20 20 20 20 6d - 79 20 40 78 20 3d 20 75 [. my @x = u]
016: 6e 70 61 63 6b 20 27 28 - 48 32 29 2a 27 2c 20 24 [npack "(H2)*", $]
017: 62 75 66 3b 0a 20 20 20 - 20 20 20 70 75 73 68 20 [buf;. push ]
018: 40 78 2c 20 27 20 20 27 - 20 75 6e 74 69 6c 20 40 [@x, " " until @]
019: 78 20 3d 3d 20 31 36 3b - 0a 0a 20 20 20 20 20 20 [x == 16;.. ]
01a: 24 62 75 66 20 3d 7e 20 - 74 72 2f 5c 78 32 30 2d [$buf =~ tr/x20-]
01b: 5c 78 37 45 2f 2e 2f 63 - 3b 0a 0a 20 20 20 20 20 [x7E/./c;.. ]
01c: 20 24 62 75 66 20 2e 3d - 20 27 20 27 20 78 20 28 [ $buf .= " " x (]
01d: 31 36 20 2d 20 6c 65 6e - 67 74 68 28 24 62 75 66 [16 - length($buf]
01e: 29 29 3b 0a 0a 20 20 20 - 20 20 20 70 72 69 6e 74 [));.. print]
01f: 66 20 22 25 30 2a 78 3a - 20 25 73 20 5b 25 73 5d [f "%0*x: %s [%s]]
020: 5c 6e 22 2c 0a 20 20 20 - 20 20 20 20 20 20 20 24 [n",. $]
021: 66 6f 72 6d 2c 0a 20 20 - 20 20 20 20 20 20 20 20 [form,. ]
022: 24 69 2b 2b 2c 0a 20 20 - 20 20 20 20 20 20 20 20 [$i++,. ]
023: 73 70 72 69 6e 74 66 28 - 20 22 25 73 20 25 73 20 [sprintf( "%s %s ]
024: 25 73 20 25 73 20 20 25 - 73 20 25 73 20 25 73 20 [%s %s %s %s %s ]
025: 25 73 20 2d 20 25 73 20 - 25 73 20 25 73 20 25 73 [%s - %s %s %s %s]
026: 20 20 25 73 20 25 73 20 - 25 73 20 25 73 22 2c 20 [ %s %s %s %s", ]
027: 40 78 20 29 2c 0a 20 20 - 20 20 20 20 20 20 20 20 [@x ),. ]
028: 24 62 75 66 3b 0a 20 20 - 20 20 7d 0a 0a 20 20 20 [$buf;. }.. ]
029: 20 70 72 69 6e 74 20 22 - 5c 6e 22 3b 0a 7d [ print "n";.} ]
1 für die Antwort № 2
Binär wird nicht verwendet und es wird keine Umwandlung in ASCII durchgeführt.
Das Programm zeigt die hexadezimale Darstellung jedes Bytes der Datei an. Im Kern ist unpack "H2", $byte
, die die hexadezimale Darstellung eines Bytes zurückgibt.
Es zeigt auch die ASCII-Darstellung dieser Bytes an. Das Programm muss dazu keine Konvertierung durchführen. Die Bytes werden einfach an das Terminal gesendet, das sie zu Glyphen abbildet.