2009-10-07 11 views
15

Recientemente escribí una secuencia de comandos que analizó una representación de texto de un campo de un solo byte binario.¿Cómo puedo convertir cadenas hexagonales en números en Perl?

(no preguntes: - {)

Después de tocar el violín con sprintf por un tiempo me di por vencido y lo hizo;

our %months = qw/x01 1 
     x02 2 
     x03 3 
     x04 4 
     x05 5 
     x06 6 
     x07 7 
     x08 8 
     x09 9 
     x0a 10 
     x0b 11 
     x0c 12 /; 
... 
my $month = $months{$text}; 

Lo que me sale con la suya, porque solo estoy usando 12 números, pero ¿hay una mejor manera de hacerlo?

+0

¿quisiste decir '0x1' en lugar de' x01'? –

+0

@Nathan En esta situación particular, no, pero en una situación no insensata es probable que desee el 0x01, pero su respuesta cubrió ambas situaciones, ¡por eso lo acepté! –

+0

Por el contrario, de decimal a hexadecimal, vea Pregunta de desbordamiento de pila * [Cómo convertir decimal a hexadecimal en Perl] (http://stackoverflow.com/questions/10481001) *. –

Respuesta

25

Si tiene

$hex_string = "0x10"; 

que puede utilizar:

$hex_val = hex($hex_string); 

y obtendrá: $hex_val == 16

hex no requiere la "0x" en el comienzo de la cadena. Si falta, todavía traducirá una cadena hexagonal a un número.

También puede utilizar oct de traducir las cadenas binarias, octales o hexadecimales de números basados ​​en el prefijo:

  • 0b - binario
  • 0 - octal
  • 0x - hexagonal
+1

Es muy obvio cuando sabes la respuesta :-) –

6

Ver hex y/o oct.

#!/usr/bin/perl 

use strict; 
use warnings; 

my @months = map hex, qw/x01 x02 x03 x04 x05 x06 x07 x08 x09 x0a x0b x0c/; 
print "$_\n" for @months; 
+0

¿Qué es 'say' en Perl? –

+1

http://perldoc.perl.org/functions/say.html –

+0

Explicar: "decir" es uno de los (nuevos cuestionables) nuevos bits de sintaxis añadidos a perls recientes. No funciona de manera predeterminada, porque al ser una sintaxis nueva, rompería los viejos scripts. Entonces usa el argumento '-E' para ejecutar un script con "todas" las características. Pero, por supuesto, eso te permite agregar todas las funciones desde que tu guión también fue escrito, lo que puede romperlo. Básicamente, el ejemplo dado es más sobre alardear que sobre la creación de una solución.Pero la respuesta sobre la función hexadecimal es correcta. –

3

Si entiendo correctamente, tiene 1 byte por mes, sin cadena "0x10", sino byte con 10.

De esta manera, se debe utilizar unpack:

my $in = "\x0a"; 
print length($in), "\n"; 
my ($out) = unpack("c", $in); 
print length($out), "\n", $out, "\n" 

de salida:

1 
2 
10 

Si la entrada es de 3 caracteres, como "x05", a continuación, cambiar también es bastante simple:

my $in = "x0a"; 
my $out = hex($in); 
+1

@depesz Tus votos a favor son simplemente injustificados. ¿Sabes lo que hace el operador 'qw //' en Perl? ¿Sabes qué * significa una representación de texto de byte binario simple *? –

+0

@Sinan: Lo sé. Supongo que OP dio \ x01, y no x01, y el \ simplemente se perdió en algún lugar. tenga en cuenta de su pregunta: "campo de un solo byte binario mensual". no "cadena de 4 bytes \ x01" o "cadena de 3 bytes" –

+0

@depesz ** representación de texto ** de un campo de un solo byte binario. Las palabras deben significar algo. –

Cuestiones relacionadas