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

问题描述 投票:0回答:4

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

(不要问:-{)

摆弄了 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 个数字,但是有更好的方法吗?

perl hex
4个回答
43
投票

如果你有

$hex_string = "0x10";

您可以使用:

$hex_val = hex($hex_string);

你会得到:

$hex_val == 16

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

您还可以使用

oct
根据前缀将二进制、八进制或十六进制字符串转换为数字:

  • 0b
    - 二进制
  • 0
    - 八进制
  • 0x
    - 十六进制

9
投票

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

0
投票

这是另一种可能更实用的方法,可以直接转换字符串中包含的十六进制。

这利用了 s/// 上的

/e
(e 表示 eval)正则表达式修饰符。

从该字符串开始:

$hello_world = "\\x48\\x65\\x6c\\x6c\\x6f\\x20\\x57\\x6f\\x72\\x6c\\x64";

十六进制转字符:

print $hello_world =~ s/\\x([0-9a-fA-F]{2})/chr hex $1/gre;

十六进制转十进制数:

print $hello_world =~ s/\\x([0-9a-fA-F]{2})/hex $1/gre;

删除

/r
修饰符以就地替换字符串。

有一天,我使用了一个 Python 脚本来处理二进制文件,但我被一个只包含十六进制数字的字节文字 (b'\x09\xff...') 困住了。

我设法用上面的一种变体的单行取回了我的字节。

© www.soinside.com 2019 - 2024. All rights reserved.