如何在Perl中将十进制转换为十六进制?

36

如何在Perl中将十进制数字$d = 1024转换为十六进制的0xFF?

需要将变量d赋值给另一个变量并打印出来,为了易读性,我希望以十六进制格式呈现。


2
只有一点提示:十六进制中的1024是0x200,而十进制中的0xFF是255。 - user2731903
1
对于反向的转换,即从十六进制到十进制,请参见 Stack Overflow 的问题 *如何在 Perl 中将十六进制字符串转换为数字?*。 - Peter Mortensen
1024 = 4 * 256 = 0x400 : perl -Mbigint -E 'say 1024->as_hex' 打印出0x400 - Tinmarino
十进制转八进制:*Perl如何以八进制打印字符?*(2013年)。要点是使用sprintf()中的%o代替%X。但是难道没有更经典的问题吗? - Peter Mortensen
4个回答

54

1024在十进制中不是0xFF,而是0x400

你可以使用sprintf函数:

my $hex = sprintf("0x%X", $d);

1
有没有更快的方法(对于一行代码)? - Tinmarino

30

注意:在32位系统上,sprintf 在232 ≅ 4×109时就会溢出,甚至在64位系统上也会在264 ≅ 1019时发生。

对于较大的数字,请启用词法预处理器bigintas_hexMath::BigInt中有文档说明。

use bigint;
my $n = 2**65;
print $n->as_hex;   # '0x20000000000000000'

2

我将这些片段放入了我的$PATH中的Perl文件:

将十进制数列表转换为十六进制和二进制

for ($i = 0; $i < @ARGV; $i++) {
    printf("%d\t= 0x%x\t= 0b%b\n", $ARGV[$i], $ARGV[$i], $ARGV[$i]);
}

将十六进制数列表转换为十进制和二进制

for ($i = 0; $i < @ARGV; $i++) {
    $val = hex($ARGV[$i]);
    printf("0x%x\t= %d\t= 0b%b\n", $val, $val, $val);
}

将二进制数字列表转换为十进制和十六进制

for ($i = 0; $i < @ARGV; $i++) {
    # The binary numbers you type must start with '0b'
    $val = oct($ARGV[$i]);
    printf("0b%b\t= %d\t= 0x%x\n", $val, $val, $val);
}

1
如果你使用foreach来遍历数据元素而不是C风格的for()来遍历数组索引,那么它会更符合Perl的惯用语。 - chicks
"0x%x" 将会输出小写字母。使用 "0x%X" 可以得到正确的大写形式。 - Peter Mortensen

0
你可以使用经典的printf()函数。
printf("%x",$d);

1
"%x" 将输出小写字母。使用"%X" 以获得正确的大写形式。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接