一次将两个字符从字符串转换为十六进制

时间:2013-05-07 01:19:59

标签: string perl hex

我有以下代码,一次将1个字符转换为十六进制。我想将两个字符转换为十六进制。即99ab应被视为'99','ab'将被转换为等效的十六进制。

目前的实施如下

$final =~ s/(.)/sprintf("0x%X ",ord($1))/eg;
chop($final);

TIA

1 个答案:

答案 0 :(得分:2)

你的问题没有多大意义。十六进制是数字的字符串表示形式。您无法将字符串转换为十六进制。

您可以将字符串的单个字符转换为十六进制,因为字符只是数字,但这显然不是您想要的。 (这就是你的代码所做的。)


我认为您正在尝试将十六进制转换为字符。

6 chars "6a6b0a" ⇒ 3 chars "\x6a\x6b\x0a"

如果是这样,您可以选择

$final =~ s/(..)/ chr(hex($1)) /seg;

$final = pack 'H*', $final;

我能想到的另一种可能性是你要解包16位整数。

6 chars "6a6b" ⇒ 13 chars "0x6136 0x6236"   (LE byte order)
   -or-
6 chars "6a6b" ⇒ 13 chars "0x3661 0x3662"   (BE byte order)

如果是,您可以使用

my @nums = unpack 'S<*', $packed;  # For 16-bit ints, LE byte order
   -or-
my @nums = unpack 'S>*', $packed;  # For 16-bit ints, BE byte order

my $final = join ' ', map sprintf('0x%04X', $_), @nums;