如何将十六进制8位分成两个4位
How to separate the Hex 8 bits into two 4 bits
我是这样用的,
$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, 0, 4;
my $z = substr $x, 4, 4;
print "z=$z, y=$y\n";
输出:
z=459f, y=002c
最好也使用 strict。我更改了你的变量名,因为 a
和 b
是 Perl 中的特殊变量。
输入数据为16进制字符串,可应用正则表达式拆分字符串按4个字符组成数组
此时你可以将结果作为字符串使用,或者你可以使用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
您应该始终使用 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
和一些潜艇。
我是这样用的,
$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, 0, 4;
my $z = substr $x, 4, 4;
print "z=$z, y=$y\n";
输出:
z=459f, y=002c
最好也使用 strict。我更改了你的变量名,因为 a
和 b
是 Perl 中的特殊变量。
输入数据为16进制字符串,可应用正则表达式拆分字符串按4个字符组成数组
此时你可以将结果作为字符串使用,或者你可以使用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
您应该始终使用 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
和一些潜艇。