web-dev-qa-db-fra.com

Comment puis-je convertir des chaînes hexadécimales en nombres en Perl?

J'ai récemment écrit un script qui analysait une représentation textuelle d'un seul champ de mois d'octet binaire.

(Ne demandez pas: - {)

Après avoir joué avec sprintf pendant un moment, j'ai abandonné et j'ai fait ça;

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

Avec quoi je m'en tire, car je n'utilise que 12 chiffres, mais y a-t-il une meilleure façon de faire cela?

24

Si tu as

$hex_string = "0x10";

vous pouvez utiliser:

$hex_val = hex($hex_string);

Et vous obtiendrez: $hex_val == 16

hex ne nécessite pas le "0x "au début de la chaîne. Si elle est manquante, elle traduira toujours une chaîne hexadécimale en nombre.

Vous pouvez également utiliser oct pour traduire des chaînes binaires, octales ou hexadécimales en nombres basés sur le préfixe:

  • 0b - binaire
  • 0 - octal
  • 0x - hexadécimal
33
Nathan Fellman

Voir hex et/ou 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;
7
Sinan Ünür

Si je comprends bien, vous avez 1 octet par mois - pas de chaîne "0x10", mais plutôt un octet contenant 10.

De cette façon, vous devez utiliser npack :

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

production:

1
2
10

Si l'entrée contient 3 caractères, comme "x05", le changement est également assez simple:

my $in = "x0a";
my $out = hex($in);
3
user80168