-1

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

目前的实现如下

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

TIA

4

1 回答 1

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;
于 2013-05-07T02:18:11.227 回答