Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何将十六进制转换为十六进制字符串_Perl - Fatal编程技术网

Perl 如何将十六进制转换为十六进制字符串

Perl 如何将十六进制转换为十六进制字符串,perl,Perl,我在理解和使用“vec”关键字时遇到问题 我正在读一个日志包,其中的值存储在小端十六进制中。在我的代码中,我必须使用关键字将不同的字节解压成标量 下面是我的问题的一个例子: my @hexData1 = qw(50 65); my $data = pack ('C*', @hexData1); my $x = unpack("H4",$data); # At which point the hexadecimal number became a number print $x."\n";

我在理解和使用“vec”关键字时遇到问题

我正在读一个日志包,其中的值存储在小端十六进制中。在我的代码中,我必须使用关键字将不同的字节解压成标量

下面是我的问题的一个例子:

my @hexData1 = qw(50 65);
my $data = pack ('C*', @hexData1);
my $x = unpack("H4",$data);    # At which point the hexadecimal number became a number 
print $x."\n";
#my $foo = sprintf("%x", $foo);

print "$_-> " . vec("\x65\x50", $_, 1) . ", " for (0..15);    # This works.
print "\n";
但我想以下面的方式使用上述声明。我不想发送带引号的十六进制字符串。我想使用十六进制$x的标量数组。但这行不通。如何将$x转换为十六进制字符串。这是我的要求

print "$_-> " . vec($x, $_, 1).", " for (0..15);    # This doesn't work.
print "\n";
我的最终目标是读取两字节十六进制数右侧的第三位


如何使用“vec”命令执行此操作?

首先,获取字节所代表的数字

如果以“\x50\x65”开头

如果以“5065”开头

如果以“50”、“65”开头


然后,提取你想要的部分

如果你想要第10位

my $bit = ($num >> 10) & 1;
如果你想要第二位

my $bit = ($num >> 2) & 1;


(我列出了一些可能性,因为我不清楚您想要什么。)

在调用
vec
之前,您犯了一个错误,
将$data解包成
$x
vec
需要一个字符串,因此如果您提供一个数字,它将在使用前转换为字符串。这是你的密码

my @hexData1 = qw(50 65);
my $data= pack ('C*', @hexData1);
C
pack
格式使用源列表中的每个值作为字符代码。这与对每个值调用
chr
并将它们连接起来是一样的。不幸的是,您的值看起来像十进制,因此您得到的是
chr(50).chr(65)
“2A”
。由于您的值是小端,所以您需要的是
chr(0x65).chr(0x50)
“\x65\x50”
,因此必须编写

my $data= pack ('(H2)*', reverse @hexData1);
它反转了数据列表(考虑到它是小端),并将其打包为两位十六进制字符串的列表(幸运的是,它是)

现在你已经做得够多了。正如我所说,
vec
需要一个字符串,以便您可以编写

print join ' ', map vec($data, $_, 1), 0 .. 15;
print "\n";
它将向你展示你所期待的点点滴滴。要从右侧提取第三位(假设您指的是位13,其中最后一位是位15),您需要


我想学习如何使用“vec”关键字。我也不知道如何从$data中解压成字符串格式并转换成标量。此外,原始数据不是字符串格式,因此不能使用“\x50\x65”。正如我在代码中所说,当我在引号中的'vec'关键字中使用“\x65\x50”时,我得到了我想要的。我想使用“vec”并传递一个标量或一个变量,该变量包含不带引号的实际字符串。谢谢那么你是从
“5065”
开始的?别告诉我那不是什么,告诉我那是什么!(我不会再发布四个猜测。在我继续之前,你要弄清楚。)你说“它不是字符串格式”,你说“它是little endian”。这些是相互矛盾的陈述。@ikegami:大概OP表示数据不是压缩字符串格式,所以源代码看起来像
“xxx 50 65 xxx”
,而不是
“\x50\x65”
@Borodin,这是可能的,我已经请他证实了这一点。
reverse
在他对另一篇帖子的评论中说,当他有两个以上的字节时,就不起作用了。
my @hexData1 = qw(50 65);
my $data= pack ('C*', @hexData1);
my $data= pack ('(H2)*', reverse @hexData1);
print join ' ', map vec($data, $_, 1), 0 .. 15;
print "\n";
print vec $data, 13, 1;