Подтвердить что ты не робот

Как преобразовать шестнадцатеричные строки в числа в Perl?

Недавно я написал script, который проанализировал текстовое представление одного бинарного байтового месяца.

(Не спрашивайте: - {)

После того, как я возился с sprintf некоторое время, я сдался и сделал это;

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

С чем мне сойдет, потому что я использую только 12 номеров, но есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Если у вас

$hex_string = "0x10";

вы можете использовать:

$hex_val = hex($hex_string);

И вы получите: $hex_val == 16

hex не требует "0x" в начале строки. Если он отсутствует, он все равно переводит шестнадцатеричную строку в число.

Вы также можете использовать oct для перевода двоичных, восьмеричных или шестнадцатеричных строк в числа на основе префикса:

  • 0b - двоичный
  • 0 - восьмеричный
  • 0x - hex

Ответ 2

См. hex и/или 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;

Ответ 3

Если я правильно понял, у вас есть 1 байт в месяц, а не строка "0x10", а скорее байт с 10 в нем.

Таким образом, вы должны использовать unpack:

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

выход:

1
2
10

Если входные данные 3 символа, такие как "x05", то изменение также довольно просто:

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