使用Perl将ASCII中的十六进制字符串转换为相同的十六进制值

时间:2014-12-24 02:48:37

标签: string perl hex ascii

我在Perl中有一个十六进制值作为ASCII字符串:

42dc3f74212c4e74bab2< - 这是一个字符串,但这也是我需要的实际十六进制值

我需要将其转换为十六进制,转换我的意思是\ x42 \ xdc \ x3f等。

$auth_key = pack("h*", $key);#它有点工作,但它给我一个低蚕,所以我最终得到24 cd f3等。

如何将此字符串转换为相同值的十六进制数!

如果有帮助的话,我试图将其输入UDP套接字。

2 个答案:

答案 0 :(得分:3)

使用pack 'H*', $key

来自perldoc -fpack

h  A hex string (low nybble first).
H  A hex string (high nybble first).

以下是shell的一些输出:

$perl -E'print pack "H*","42dc3f74212c4e74bab2"' | hd
00000000  42 dc 3f 74 21 2c 4e 74  ba b2                    |B.?t!,Nt..|
0000000a

答案 1 :(得分:1)

另一种方式:

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()非常有效,所以应该首选它们。