Pregunta

Tengo un volcado hexadecimal de un mensaje en un fichero del cual quiero conseguirlo en una matriz para que pueda realizar la lógica de decodificación en él.
Me preguntaba si eso era una manera más fácil de analizar un mensaje que se parece a esto.

  

37 39 30 35 32 34 35 34 3B 32 31 36 39 33 34 35
  3B 32 31 36 39 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 6C 63 6F 72 64 69
  74 65 6C 63 6F 72 64 69

Tenga en cuenta que los datos pueden ser como máximo de 16 bytes en cualquier fila. Pero cualquier fila puede contener menos bytes demasiado (mínimo: 1)
¿Hay una manera elegante y agradable en lugar de leer 2 caracteres en un momento en Perl?

¿Fue útil?

Solución

hex operador que realiza la lógica de decodificación para usted.

  

hex EXPR

     

hex

     

Interpreta EXPR como una cadena hexadecimal y devuelve el valor correspondiente. (Para convertir ese cadenas puede comenzar con cualquiera 0, 0x o 0b, consulte oct . ) Si se omite EXPR, usos $_.

print hex '0xAf'; # prints '175'
print hex 'aF'; # same

Recuerde que el comportamiento predeterminado de split chuletas de una cadena en los separadores de espacios en blanco, por lo por ejemplo

$ perl -le '$_ = "a b c"; print for split'
a
b
c

Para cada línea de la entrada, separarlo en valores hexadecimales, convertir los valores a números, y push ellos en una matriz para su posterior procesamiento.

#! /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";

Ejecutar la muestra:

$ ./sumhex mtanish-input 
4196

Otros consejos

Me leer una línea a la vez, tira el espacio en blanco, y el uso pack 'H*' para convertirlo. Es difícil ser más específicos, sin saber qué tipo de "decodificar la lógica" que está tratando de aplicar. Por ejemplo, aquí está una versión que convierte cada byte a decimales:

while (<>) {
  s/\s+//g;
  my @bytes = unpack('C*', pack('H*', $_));
  print "@bytes\n";
}

Salida desde su archivo de ejemplo:

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

Creo que la lectura en dos caracteres a la vez es la forma adecuada para analizar una corriente cuya lógica fichas son unidades de dos caracteres.

¿Hay alguna razón usted piensa que es feo?

Si usted está tratando de extraer una secuencia particular, se puede hacer eso con las expresiones regulares de espacio en blanco y minúsculas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top