我使用sprintf
转换为十六进制 - 示例>>
$hex = sprintf("0x%x",$d)
但是我想知道,如果没有sprintf
,如果有其他方法可以做到这一点。
我的目标是将数字转换为4字节十六进制代码(例如013f571f
)
此外(以及可选),如果数字为4 * %0xxxxxxx
格式,每个字节仅使用7位,我该如何进行此类转换?
答案 0 :(得分:4)
sprintf()
可能是最合适的方式。根据{{3}}:
要将内容呈现为十六进制,请查看http://perldoc.perl.org/functions/hex.html,printf和sprintf。
我不确定你的第二个问题,听起来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))));
非常欢迎任何评论和改进。