1

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

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

但我想知道,是否有其他方法可以在没有sprintf.

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

4 * %0xxxxxxx另外(并且可选地),如果数字是格式的,我该如何进行这种转换,每字节仅使用 7 位?

4

4 回答 4

4

sprintf()可能是最合适的方式。根据http://perldoc.perl.org/functions/hex.html

要将某些内容显示为十六进制,请查看printfsprintfunpack

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

于 2013-06-24T15:37:36.897 回答
2

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

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

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

pack 'N', 0x013f571f;  # "\x01\x3f\x57\x1f" Big-endian byte order
pack 'V', 0x013f571f;  # "\x1f\x57\x3f\x01" Little-endian byte order
于 2013-06-24T16:39:29.130 回答
1

sprintf()是我执行此转换的常用方式。你可以用 unpack 来做,但你可能会付出更多的努力。

对于仅使用 4 字节值,以下将起作用(可能没有预期的那么优雅!):

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

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

pack/unpack使用任意位长度,请查看http://www.perlmonks.org/?node_id=383881

perlpacktut很方便阅读。

于 2013-06-24T15:41:14.443 回答
0

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

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

非常欢迎任何意见和改进。

于 2013-06-24T15:57:56.940 回答