我sprintf
用于转换为十六进制 - 示例 >>
$hex = sprintf("0x%x",$d)
但我想知道,是否有其他方法可以在没有sprintf
.
我的目标是将数字转换为 4 字节十六进制代码(例如013f571f
)
4 * %0xxxxxxx
另外(并且可选地),如果数字是格式的,我该如何进行这种转换,每字节仅使用 7 位?
我sprintf
用于转换为十六进制 - 示例 >>
$hex = sprintf("0x%x",$d)
但我想知道,是否有其他方法可以在没有sprintf
.
我的目标是将数字转换为 4 字节十六进制代码(例如013f571f
)
4 * %0xxxxxxx
另外(并且可选地),如果数字是格式的,我该如何进行这种转换,每字节仅使用 7 位?
我的目标是将数字转换为 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
sprintf()
是我执行此转换的常用方式。你可以用 unpack 来做,但你可能会付出更多的努力。
对于仅使用 4 字节值,以下将起作用(可能没有预期的那么优雅!):
print unpack("H8", pack("N1", $d));
请注意,对于大于此的数字,这也会导致 0xFFFFFFFF。
要pack/unpack
使用任意位长度,请查看http://www.perlmonks.org/?node_id=383881
perlpacktut也很方便阅读。
对于4 * %0xxxxxxx
格式,我的非sprintf
解决方案是:
print unpack("H8", pack("N1",
(((($d>>21)&0x7f)<<24) + ((($d>>14)&0x7f)<<16) + ((($d>>7)&0x7f)<<8) + ($d&0x7f))));
非常欢迎任何意见和改进。