Как разделить шестнадцатеричные 8 бит на два 4 бита

#perl #modulus

#perl #модуль

Вопрос:

Я использую так,

 $a = "002c459f";
$b = $a000;
$c = int($a/10000); 
print $b;       #prints 0
print $c;       #prints 2
  

Я хочу

$ b = 459f;

$ c = 002c;

Может кто-нибудь подсказать, как я это получу?

Ответ №1:

Если бы вы использовали предупреждения, вы бы получили предупреждающее сообщение, указывающее на проблему.

Поскольку ваш 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=$yn";
  

Вывод:

z = 459f, y = 002c

Рекомендуется также использовать strict . Я изменил имена ваших переменных с тех пор a , как и b являются специальными переменными в Perl.

Ответ №2:

Вы всегда должны использовать 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 amp; 0xFFFF;
my $c_num = int( $a_num / 0x10000 );  # More common: my $c_num = $a_num >> 16

my $b_hex = sprintf("x", $b_num);
my $c_hex = sprintf("x", $c_num);
  

Но если у вас ровно восемь символов, вы можете использовать следующее вместо:

 my ($c, $b) = unpack('a4 a4', $a);
  

Примечание: вам следует избегать использования $a and $b , так как это может помешать работе с sort и некоторыми подразделениями.

Ответ №3:

Входные данные представляют собой шестнадцатеричную строку, регулярное выражение может быть применено для разделения строки на 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$ctstrings";   # values are strings

$b = hex($b);               # convert to digit
$c = hex($c);               # convert to digit

printf "0xx 0xxtdigitsn", $b, $c;
  

Вывод

 0x002c 0x459f   strings
0x002c 0x459f   digits
  

Комментарии:

1. Зачем преобразовывать из шестнадцатеричного только для немедленного преобразования в шестнадцатеричный? Код неясен.

2. @ikegami — Намерения OP неясны из его вопроса, нужна ли ему строка или число?