如何将十六进制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。我更改了你的变量名,因为 ab 是 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 和一些潜艇。