如何在Perl中将十进制数转换为十六进制字符串?

3

如何在Perl中将十进制数转换为十六进制字符串?

例如,我想将2001转换为"0x07"和"0xD1"。


@Peter,我认为你的编辑违反了作者的意图。根据答案评论,“0x07”,“0xD1”是作者想要的正确C语法。而“0x07”和“0xD1”则不是。 - Oleg V. Volkov
2个回答

5

这适用于那种情况:

($x,$y) = map { "0x$_" } 
          sprintf("%04X\n", 2001) =~ /(..)(..)/; 

但我想知道你真正想做什么。如果你想获取 UTF-16 编码,这不是你想要的方式。

如果你试图弄清楚紧凑二进制数据的布局,则应使用 unpack。 "C4" 格式可用于 4 字节整数。

$int = 2001;
$bint = pack("N", $int);
@octets = unpack("C4", $bint);
printf "%02X " x 4 . "\n", @octets;
# prints: 00 00 07 D1

对于某些用途,您可以使用printf的向量打印功能:

printf "%v02X\n", pack("N", 2001);
# prints: 00.00.07.D1

printf "%v02X\n", 255.255.255.240;
# prints: FF.FF.FF.F0

这很不错,您能否将其概括一下,不仅限于2字节数字。我已经将($x,$y)更改为@arr,那么=〜/(..)(..)/呢? - embedded

1

我不确定您需要的确切格式,但将其转换为十六进制的一种方法是:

sprintf("%x", 2001)

1
这对我来说还不够好。我需要将每个字节转换为十六进制字符串。 - embedded
1
你正在尝试做的有些别扭。如果你在更高层次上描述你想要实现的目标,可能会有其他策略出现给你参考。 - Marcelo Cantos
我需要在C语言中填充一个结构体。因此,我需要编写一个脚本,将int类型的每个字节转换为十六进制字符串字节。 - embedded
你是想生成C代码,还是仅构造C结构体的字节?如果是后者,则使用pack("S", 2001) - Marcelo Cantos
不会输出为"07D1"。"%x"将以小写形式输出。使用"%X"以获得正确的大写形式。 - Peter Mortensen

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