Как я могу преобразовать шестнадцатеричные строки в числа в Perl? - PullRequest
19 голосов
/ 07 октября 2009

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

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

Поработав некоторое время со 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 чисел, но есть ли лучший способ сделать это?

Ответы [ 3 ]

29 голосов
/ 07 октября 2009

Если у вас есть

$hex_string = "0x10";

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

$hex_val = hex($hex_string);

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

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

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

  • 0b - двоичный файл
  • 0 - восьмеричное
  • 0x - hex
7 голосов
/ 07 октября 2009

См. 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 голосов
/ 07 октября 2009

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

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...