我有以下一段代码,它一次将 1 个字符转换为十六进制。我想将两个字符转换为十六进制。ie 99ab 应该被视为'99','ab' 被转换成它的等效十六进制。
目前的实现如下
$final =~ s/(.)/sprintf("0x%X ",ord($1))/eg;
chop($final);
TIA
你的问题没有多大意义。十六进制是数字的字符串表示。您不能将字符串转换为十六进制。
您可以将字符串的单个字符转换为十六进制,因为字符只是数字,但这显然不是您想要的。(这就是你的代码所做的。)
我认为您正在尝试从十六进制转换为字符。
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;