问题描述
我正在这样使用
$a = "002c459f";
$b = $a%10000;
$c = int($a/10000);
print $b; #prints 0
print $c; #prints 2
我想要
$ b = 459f;
$ c = 002c;
有人可以建议我怎么得到这个吗?
解决方法
如果您使用过warnings,将会收到一条警告消息,指出一个问题。
由于您的8位输入已被格式化为简单的十六进制字符串,因此您只需使用substr:
use warnings;
use strict;
my $x = '002c459f';
my $y = substr $x,4;
my $z = substr $x,4,4;
print "z=$z,y=$y\n";
输出:
z = 459f,y = 002c
最好也使用strict。我更改了您的变量名,因为a
和b
是Perl中的特殊变量。
您应该始终使用use strict; use warnings;
!它将告诉您002c459f
不是数字。 (这是数字的十六进制表示。)因此,在将其转换为数字之前不能使用除法。您还使用了错误的除数(10000
而不是0x10000
)。
my $a_num = hex($a_hex);
my $b_num = $a_num % 0x10000; # More common: my $b_num = $a_num & 0xFFFF;
my $c_num = int( $a_num / 0x10000 ); # More common: my $c_num = $a_num >> 16
my $b_hex = sprintf("%04x",$b_num);
my $c_hex = sprintf("%04x",$c_num);
但是如果您恰好有八个字符,则可以改用以下字符:
my ($c,$b) = unpack('a4 a4',$a);
注意:您应避免使用$a
和$b
,因为它可能会干扰sort
和某些子项。
输入数据为十六进制字符串,可以将正则表达式以4个字符的形式应用于 split 字符串。
此时,您可以将result用作字符串,也可以使用hex()
将十六进制字符串表示形式转换为perl的内部数字表示形式。
use strict;
use warnings;
use feature 'say';
my $a = "002c459f"; # value is a string
my($b,$c) = $a =~ /([\da-f]{4})/gi;
say "0x$b 0x$c\tstrings"; # values are strings
$b = hex($b); # convert to digit
$c = hex($c); # convert to digit
printf "0x%04x 0x%04x\tdigits\n",$b,$c;
输出
0x002c 0x459f strings
0x002c 0x459f digits