如何在Perl中将十六进制字符串转换为数字?

时间:2009-10-07 14:30:51

标签: perl hex

我最近写了一个脚本,它解析了单个二进制字节月字段的文本表示。

(不要问: - {)

在摆弄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 个答案:

答案 0 :(得分:28)

如果你有

$hex_string = "0x10";

你可以使用:

$hex_val = hex($hex_string);

你会得到:$hex_val == 16

hex不需要字符串开头的“0x”。如果它丢失了,它仍然会将十六进制字符串转换为数字。

您还可以使用oct将二进制,八进制或十六进制字符串转换为基于前缀的数字:

  • 0b - 二进制
  • 0 - 八进制
  • 0x - hex

答案 1 :(得分:7)

请参阅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;

答案 2 :(得分: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);