将数字转换为十六进制

时间:2013-06-24 15:12:45

标签: perl

我使用sprintf转换为十六进制 - 示例>>

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

但是我想知道,如果没有sprintf,如果有其他方法可以做到这一点。

我的目标是将数字转换为4字节十六进制代码(例如013f571f

此外(以及可选),如果数字为4 * %0xxxxxxx格式,每个字节仅使用7位,我该如何进行此类转换?

4 个答案:

答案 0 :(得分:4)

sprintf()可能是最合适的方式。根据{{​​3}}:

  

要将内容呈现为十六进制,请查看http://perldoc.perl.org/functions/hex.htmlprintfsprintf

我不确定你的第二个问题,听起来unpack()在那里很有用。

答案 1 :(得分:2)

  

我的目标是将数字转换为4字节十六进制代码(例如013f571f)

Hex是数字的文字表示。 sprintf '%X'返回十六进制(八个字符013f571f)。 sprintf专门用于将数字格式化为文本,因此它是一种非常优雅的解决方案。

......但这不是你想要的。你不是在寻找十六进制,你正在寻找整数的4字节内部存储。这与hex无关。

pack 'N', 0x013f571f;  # "\x01\x3f\x57\x1f" Big-endian byte order
pack 'V', 0x013f571f;  # "\x1f\x57\x3f\x01" Little-endian byte order

答案 2 :(得分:1)

sprintf()是我执行此转换的常用方法。你可以通过解压缩来完成它,但它可能会更加努力。

仅使用4个字节的值,以下方法可行(可能不如预期的那样优雅!):

print unpack("H8", pack("N1", $d));

请注意,对于大于此值的数字,这将导致0xFFFFFFFF。

对于具有任意位长的pack/unpack工作,请查看http://www.perlmonks.org/?node_id=383881

perlpacktut也是一个方便的阅读。

答案 3 :(得分:0)

对于4 * %0xxxxxxx格式,我的非sprintf解决方案是:

print unpack("H8", pack("N1", 
  (((($d>>21)&0x7f)<<24) + ((($d>>14)&0x7f)<<16) + ((($d>>7)&0x7f)<<8) + ($d&0x7f))));

非常欢迎任何评论和改进。