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?

War es hilfreich?

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 oder 0b beginnen könnten, finden Sie unter oct . 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top