我有以下代码,一次将1个字符转换为十六进制。我想将两个字符转换为十六进制。即99ab应被视为'99','ab'将被转换为等效的十六进制。
目前的实施如下
$final =~ s/(.)/sprintf("0x%X ",ord($1))/eg;
chop($final);
TIA
答案 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;