我在Perl中有一个作为ASCII字符串的十六进制值:
42dc3f74212c4e74bab2
<-- 这是一个字符串,但也是我需要的实际十六进制值。
我需要将其转换为十六进制,通过转换我意味着 \x42\xdc\x3f 等等。
$auth_key = pack("h*", $key);
#它有点起作用,但它给出了一个低四位,所以我最终得到的是 24 cd f3
,等等。
如何将此字符串转换为相同值的十六进制!
如果可以的话,我正在尝试将其馈入UDP套接字。
我在Perl中有一个作为ASCII字符串的十六进制值:
42dc3f74212c4e74bab2
<-- 这是一个字符串,但也是我需要的实际十六进制值。
我需要将其转换为十六进制,通过转换我意味着 \x42\xdc\x3f 等等。
$auth_key = pack("h*", $key);
#它有点起作用,但它给出了一个低四位,所以我最终得到的是 24 cd f3
,等等。
如何将此字符串转换为相同值的十六进制!
如果可以的话,我正在尝试将其馈入UDP套接字。
请使用pack 'H*', $key
。
来自于perldoc -fpack
:
h A hex string (low nybble first).
H A hex string (high nybble first).
$perl -E'print pack "H*","42dc3f74212c4e74bab2"' | hd
00000000 42 dc 3f 74 21 2c 4e 74 ba b2 |B.?t!,Nt..|
0000000a
pack "H*"
(例如由于一个构造错误的shell命令),要么你同时改变了其他东西。 - ikegami"
,它还能正常工作吗?如果它能正常工作,我会感到惊讶。 - TLPperl -e 'print pack "H*","42dc3f74"' | hd
可能会产生 0000000 dc42 743f
的输出,但这是由于 hd
输出的小端16位结果造成的。然而,pack
的结果是正确的且符合预期的。为了更清晰地显示,请使用 hd -t xc
。 - MattTT另一种方法:
use strict;
use warnings;
use 5.016;
my $str = "42dc3f74212c4e74bab2";
$str =~ s/(..)/chr(hex($1))/eg; #hex() -> convert hex string to decimal number, chr() -> convert decimal number to a character(string).
say $str;
say (pack "H*","42dc3f74212c4e74bab2");
--output:--
B??t!,Nt??
B??t!,Nt??
使用hexdump进行往返转换:
$ perl -E'print "42dc3f74212c4e74bab2" =~ s/(..)/chr(hex($1))/erg' | hexdump -C
00000000 42 dc 3f 74 21 2c 4e 74 ba b2 |B.?t!,Nt..|
0000000a
pack() / unpack()非常高效,因此应优先使用。