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?

È stato utile?

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 o 0b, vedi oct . ) 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top