web-dev-qa-db-ja.com

16進文字列をPerlで数値に変換するにはどうすればよいですか?

私は最近、シングルバイナリバイトの月フィールドのテキスト表現を解析するスクリプトを書きました。

(尋ねないでください:-{)

しばらく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の数値しか使用していないので、これでうまくいきますが、これを行うより良い方法はありますか?

24

あなたが持っている場合

$hex_string = "0x10";

あなたは使うことができます:

$hex_val = hex($hex_string);

そして、あなたは得るでしょう:$hex_val == 16

hexは「0x "を文字列の先頭に追加します。これがない場合でも、16進数の文字列を数値に変換します。

octを使用して、2進数、8進数、16進数の文字列をプレフィックスに基づいて数値に変換することもできます。

  • 0b-バイナリ
  • 0-8進数
  • 0x-16進数
33
Nathan Fellman

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;
7
Sinan Ünür

私が正しく理解していれば、月に1バイトあります。「0x10」の文字列ではなく、10のバイトです。

このように、 npack を使用する必要があります:

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

出力:

1
2
10

入力が「x05」のような3文字の場合、変更も非常に簡単です。

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