Как преобразовать шестнадцатеричные строки в числа в 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 номеров, но есть ли лучший способ сделать это?
Ответы
Ответ 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);