Hex-Dump-Analyse in Perl
Frage
Ich habe einen Hex-Dump einer Nachricht in einer Datei, die ich will, um es in einem Array
also kann ich die Decodierung Logik darauf ausführen.
Ich frage mich, ob das ein einfacher Weg, war eine Nachricht, die wie folgt aussehen zu analysieren.
37 39 30 35 32 34 35 34 3B 32 31 36 39 33 34 35
32 3B 36 39 33 31 34 36 00 00 01 08 40 00 00 15
6C 71 34 34 73 69 31 6D 5F 33 31 33 30 00 00 00
00 00 01 28 40 00 00 15 74 65 63 6F 72 6C 64 69
74 65 6C 63 6F 72 64 69
Beachten Sie, dass die Daten 16 Bytes auf einer beliebigen Zeile darf max. Aber jede Zeile kann weniger enthalten Bytes zu (Minimum: 1)
Gibt es eine schöne und elegante Art und Weise eher als 2 Zeichen zu einer Zeit, zu lesen in Perl?
Lösung
hat Perl eine hex
Betreiber, dass für Sie die Decodierung Logik führt.
hex EXPR
hex
Interpretiert EXPR als Hex-String und gibt den entsprechenden Wert. (Zu konvertieren Zeichenfolgen, die mit beiden
0
,0x
oder0b
beginnen könnten, finden Sie unteroct
. If) EXPR weggelassen wird, Verwendungen$_
.print hex '0xAf'; # prints '175' print hex 'aF'; # same
Beachten Sie, dass das Standardverhalten von split
hackt einen String an Leerzeichen Separatoren nach oben, so zum Beispiel
$ perl -le '$_ = "a b c"; print for split' a b c
Für jede Zeile der Eingabe, trennen sie in Hex-Werte, wandeln die Werte in Zahlen und push
sie auf eine Anordnung für eine spätere Verarbeitung.
#! /usr/bin/perl
use warnings;
use strict;
my @values;
while (<>) {
push @values => map hex($_), split;
}
# for example
my $sum = 0;
$sum += $_ for @values;
print $sum, "\n";
Probendurchlauf:
$ ./sumhex mtanish-input 4196
Andere Tipps
würde ich eine Zeile zu einem Zeitpunkt lesen, die Leerzeichen abzustreifen und um pack 'H*'
es zu konvertieren. Es ist schwer, um genauer zu sein, ohne zu wissen, welche Art von „Decodierung Logik“ Sie versuchen zu übernehmen. Zum Beispiel, hier ist eine Version, die konvertiert jedes Byte dezimal:
while (<>) {
s/\s+//g;
my @bytes = unpack('C*', pack('H*', $_));
print "@bytes\n";
}
Ausgabe von Ihrer Beispieldatei:
55 57 48 53 50 52 53 52 59 50 49 54 57 51 52 53
59 50 49 54 57 51 52 54 0 0 1 8 64 0 0 21
108 113 52 52 115 105 109 49 95 51 48 51 49 0 0 0
0 0 1 40 64 0 0 21 116 101 108 99 111 114 100 105
116 101 108 99 111 114 100 105
ich glaube, zu einer Zeit, in zwei Zeichen Lesen der geeignete Weg ist, einen Strom, dessen logische Token sind zwei Zeicheneinheiten zu analysieren.
Gibt es einen Grund, warum Sie denken, dass ist hässlich?
Wenn Sie versuchen, eine bestimmte Sequenz zu extrahieren, könnten Sie das tun mit Leerzeichen unempfindlichen regulärer Ausdrücke.