【发布时间】:2020-09-19 19:04:33
【问题描述】:
我就是这样用的,
$a = "002c459f";
$b = $a%10000;
$c = int($a/10000);
print $b; #prints 0
print $c; #prints 2
我想要
$b=459f;
$c=002c;
谁能建议我如何得到这个?
【问题讨论】:
我就是这样用的,
$a = "002c459f";
$b = $a%10000;
$c = int($a/10000);
print $b; #prints 0
print $c; #prints 2
我想要
$b=459f;
$c=002c;
谁能建议我如何得到这个?
【问题讨论】:
您应该始终使用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 和一些subs。
【讨论】:
输入数据是一个十六进制字符串,正则表达式可以将字符串拆分 4个字符组成一个数组。
此时可以使用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
【讨论】: