2009-10-07 13 views
15

Recentemente ho scritto uno script che ha analizzato una rappresentazione testuale di un singolo campo mese byte binario.Come posso convertire stringhe esadecimali in numeri in Perl?

(Non chiedere: - {)

Dopo armeggiare con sprintf per un po 'ho rinunciato e fatto questo;

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}; 

Quale scappare, perché sto usando solo 12 numeri, ma c'è un modo migliore per farlo?

+0

intendevi "0x1" invece di "x01"? –

+0

@Nathan In questa particolare situazione no, ma in situazioni non-insane probabilmente si vorrà il 0x01, ma la tua risposta copre entrambe le situazioni, ed è per questo che l'ho accettata! –

+0

Per il contrario, da decimale a esadecimale, vedere Domanda di overflow dello stack * [Come convertire i decimali in esadecimale in Perl] (http://stackoverflow.com/questions/10481001) *. –

risposta

25

Se hai

$hex_string = "0x10"; 

è possibile utilizzare:

$hex_val = hex($hex_string); 

e si otterrà: $hex_val == 16

hex non richiede il "0x" alla inizio della stringa. Se manca, tradurrà ancora una stringa esadecimale in un numero.

È inoltre possibile utilizzare oct di tradurre binario, ottale o esadecimale stringhe in numeri in base al prefisso:

  • 0b - binario
  • 0 - ottale
  • 0x - hex
+1

È così ovvio quando conosci la risposta :-) –

6

Vedere hex e/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

cosa significa 'say' in Perl? –

+1

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

+0

Per esporre: "say" è uno dei nuovi bit di sintassi (IMHO discutibili) aggiunti ai recenti perls. Di default non funziona, perché essendo una nuova sintassi, romperebbe i vecchi script. Quindi si utilizza l'argomento '-E' per eseguire uno script con caratteristiche "all". Ma ovviamente questo ti dà tutte le funzionalità aggiunte da quando anche il tuo script è stato scritto, il che potrebbe infrangerlo. Fondamentalmente, l'esempio dato è più sul mettersi in mostra piuttosto che sull'engenerazione di una soluzione.Ma la risposta sulla funzione esadecimale è giusta. –

3

Se ho capito bene hai 1 byte al mese - non una stringa "0x10", ma piuttosto un byte con 10 in esso.

In questo modo, si dovrebbe usare unpack:

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

uscita:

1 
2 
10 

Se l'ingresso sono 3 personaggi, come "x05", quindi modificando è anche abbastanza semplice:

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

@depesz I tuoi downvotes sono semplicemente ingiustificati. Sai cosa fa l'operatore 'qw //' in Perl? Sai cosa * una rappresentazione testuale di un singolo byte binario * significa? –

+0

@Sinan: lo so. Immagino che OP abbia dato \ x01, e non x01 - e \ è stato semplicemente perso da qualche parte. si prega di notare dalla sua domanda: "campo mese byte byte binario singolo". non "4 byte string \ x01" o "3 byte string" –

+0

@depesz ** rappresentazione del testo ** di un singolo campo mese byte binario. Le parole devono significare qualcosa. –

Problemi correlati