Hex discarica analisi in perl
Domanda
Ho un dump esadecimale di un messaggio in un file che voglio farlo in un array
così posso eseguire la decodifica logica su di esso.
Mi chiedevo se quello era un modo più semplice per analizzare un messaggio che assomiglia a questo.
37 39 30 35 32 34 35 34 3B 32 31 36 39 33 34 35
3B 31 36 39 32 33 34 36 00 00 01 08 40 00 00 15
6C 71 34 34 73 69 31 6D 5F 33 30 33 31 00 00 00
00 00 01 28 40 00 00 15 74 65 63 6F 6C 72 64 69
74 65 6C 63 6F 72 64 69
Si noti che i dati possono essere al massimo di 16 byte su qualsiasi riga. Ma ogni fila può contenere meno byte troppo (minimo: 1)
C'è un piacevole e modo elegante, piuttosto che leggere 2 caratteri in un momento in perl?
Soluzione
Perl ha un hex
operatore che esegue la logica di decodifica per voi.
hex EXPR
hex
Interpreta ESPR come una stringa esadecimale e restituisce il valore corrispondente. (Per le stringhe di convertire che potrebbe iniziare con
0
,0x
o0b
, vedioct
. ) Se ESPR viene omessa, usi$_
.print hex '0xAf'; # prints '175' print hex 'aF'; # same
Ricordate che il comportamento predefinito di split
sminuzza una stringa a separatori di spazi bianchi, in modo ad esempio
$ perl -le '$_ = "a b c"; print for split' a b c
Per ogni linea di ingresso, separarla in valori esadecimali, convertire i valori di numeri, e push
loro su un array per l'elaborazione successiva.
#! /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";
esempio di esecuzione:
$ ./sumhex mtanish-input 4196
Altri suggerimenti
vorrei leggere una riga alla volta, a nudo lo spazio bianco, e l'uso pack 'H*'
per convertirlo. E 'difficile essere più precisi, senza sapere che tipo di "decodifica logica" si sta cercando di applicare. Ad esempio, ecco una versione che converte ogni byte di decimali:
while (<>) {
s/\s+//g;
my @bytes = unpack('C*', pack('H*', $_));
print "@bytes\n";
}
Uscita dal file di esempio:
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
Credo che la lettura in due caratteri alla volta è il modo più appropriato per analizzare un flusso di gettoni le cui logiche sono unità di due caratteri.
C'è qualche motivo si pensa che è brutto?
Se si sta cercando di estrarre una particolare sequenza, si potrebbe farlo con le espressioni regolari spazio bianco-insensitive.