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?

Était-ce utile?

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 ou 0b, consultez oct. ) 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top