如何将十六进制8位分成两个4位

问题描述

我正在这样使用

$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。我更改了您的变量名,因为ab是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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...