Hexa d'analyse syntaxique perl
Question
J'ai une décharge à six pans d'un message dans un fichier que je veux l'obtenir dans un tableau
afin que je puisse effectuer la logique de décodage sur elle.
Je me demandais si cela était un moyen plus facile d'analyser un message qui ressemble à ceci.
37 39 30 35 32 34 35 34 3B 31 36 39 32 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 6D 31 5F 30 33 31 33 00 00 00
00 00 01 28 40 00 00 15 74 65 6C 63 72 6F 64 69
74 65 6C 63 72 6F 64 69
Notez que les données peuvent être au maximum de 16 octets sur une ligne quelconque. Mais une ligne peut contenir moins d'octets trop (minimum: 1)
Est-il un moyen agréable et élégant plutôt que de lire 2 caractères à la fois en perl?
La solution
Perl a hex
opérateur qui effectue la logique de décodage pour vous.
hex EXPR
hex
Interpréter EXPR comme une chaîne hexadécimale et renvoie la valeur correspondante. (Pour convertir des chaînes qui commencent soit
0
,0x
ou0b
, consultezoct
. ) Si EXPR est omis, utilise$_
.print hex '0xAf'; # prints '175' print hex 'aF'; # same
Rappelez-vous que le comportement par défaut de split
côtelettes jusqu'à une chaîne à séparateurs blancs, donc par exemple
$ perl -le '$_ = "a b c"; print for split' a b c
Pour chaque ligne de l'entrée, le séparer en valeurs hexagonales, convertir les valeurs en nombres, et push
les sur un réseau pour un traitement ultérieur.
#! /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";
run de l'échantillon:
$ ./sumhex mtanish-input 4196
Autres conseils
Je lirais une ligne à la fois, dépouiller les espaces blancs, et utiliser pack 'H*'
pour le convertir. Il est difficile d'être plus précis, sans savoir quel genre de « logique de décodage » vous essayez d'appliquer. Par exemple, voici une version qui convertit chaque octet en décimal:
while (<>) {
s/\s+//g;
my @bytes = unpack('C*', pack('H*', $_));
print "@bytes\n";
}
La sortie de votre fichier exemple:
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
Je pense que la lecture de deux caractères à la fois est de manière appropriée pour analyser un flux dont les jetons sont des unités logiques à deux caractères.
Y at-il une raison quelconque vous pensez que ce laid?
Si vous essayez d'extraire une séquence particulière, vous pouvez le faire avec des expressions régulières par des espaces insensibles.