Perl - преобразовать шестнадцатеричное в двоичное и использовать его в качестве строки - PullRequest
5 голосов
/ 07 марта 2019

Я новичок в Perl, и у меня возникают трудности с использованием различных типов.

Я пытаюсь получить шестнадцатеричный регистр, преобразовать его в двоичный, использовать его как строку и получить подстроки из двоичной строки.

Я сделал несколько поисков и попытался:

my $hex = 0xFA1F;
print "$hex\n";

результат был "64031".Первый сюрприз: я не могу напечатать шестнадцатеричное значение в Perl, а не только десятичное значение?

$hex = hex($hex);
print "$hex\n";

Результат был 409649. Второй сюрприз: я ожидаю, что результат также будет 64031, так как "hex" конвертируетот шестнадцатеричного до десятичного.

my $bin = printf("%b", $hex);

Печатает двоичное значение.Есть ли способ преобразовать гекс в корзину без печати?

Спасибо, SLP

Ответы [ 4 ]

4 голосов
/ 07 марта 2019

Десятичные, двоичные и шестнадцатеричные - это все текстовые представления числа (т.е. способы записи числа).Компьютеры не могут обрабатывать их как числа.

my $num = 0xFA1F; сохраняет указанное число (шестьдесят четыре тысячи тридцать один) в $num.Он хранится в формате, понятном аппаратному обеспечению, но это не очень важно.Важно то, что оно хранится в виде числа, а не текста.

Когда print запрашивается для печати числа, оно печатается в десятичном виде (или в научной записи, если оно достаточно большое / маленькое).Он не имеет представления о том, как число создано (из шестнадцатеричной константы? Из сложения? И т. Д.), Поэтому он не может определить, как вывести число на основе этого.

Чтобы напечатать число в шестнадцатеричном виде, выможно использовать

my $hex = 'FA1F';   # $hex contains the hex representation of the number.
print $hex;         # Prints the hex representation of the number.

или

my $num = 0xFA1F;   # $num contains the number.
printf "%X", $num;  # Prints the hex representation of the number.
3 голосов
/ 07 марта 2019

Вы присваиваете целочисленное значение в шестнадцатеричном формате. print по умолчанию печатает числа в десятичном формате, поэтому вы получаете 64031.

Вы можете проверить это с помощью printf (), задав разные форматы.

$ perl -e ' my $num = 0xFA1F; printf("%d %X %b\n", ($num) x 3 ) '
64031 FA1F 1111101000011111

$ perl -e ' my $num = 64031; printf("%d %X %b\n", ($num) x 3 ) '
64031 FA1F 1111101000011111

$ perl -e ' my $num = 0b1111101000011111; printf("%d %X %b\n", ($num) x 3 ) '
64031 FA1F 1111101000011111

$

Чтобы получить двоичный формат 0xFA1F в строке, вы можете использовать sprintf ()

$ perl -e ' my $hex = 0xFA1F; my $bin=sprintf("%b",$hex) ; print "$bin\n" '
1111101000011111

$
2 голосов
/ 07 марта 2019

Если вы согласны с использованием дистрибутива, я написал Bit :: Manip , чтобы немного упростить прототипирование при работе с регистрами (также доступна версия Pure Perl если у вас есть проблемы с компиляцией кода XS).

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

use warnings;
use strict;

use Bit::Manip qw(:all);

my $register = 0xFA1F;

# fetch the bits from register using msb, lsb

my $msbyte = bit_get($register, 15, 8);

print "value: $msbyte\n";

print "bin: " . bit_bin($msbyte) . "\n";

# or simply:
# printf "bin: %b\n", $msbyte;

Выход:

value: 250
bin: 11111010

Вот сообщение в блоге Я написал, что показывает, как использовать некоторые функции программного обеспечения с примером регистра таблицы данных.

2 голосов
/ 07 марта 2019

давайте рассмотрим каждый бит путаницы в порядке

my $hex = 0xFA1F;

Здесь хранится шестнадцатеричная константа в $hex, но в Perl нет шестнадцатеричного типа данных, поэтому, хотя вы можете записать шестнадцатеричные константы, а также двоичные и восьмеричные константы, Perl преобразует их все в десятичное число. Обратите внимание, что существует большая разница между

my $hex = 0xFA1F;

и

my $hex = '0xFA1F';

Первый хранит число в $ hex, которое при его распечатывании дает десятичное число, второе сохраняет строку, которая при распечатке даст 0xFAF1, но может быть передана в функцию hex() для преобразуется в десятичную.

$hex = hex($hex);

Шестнадцатеричная функция преобразует строку , как если бы это было шестнадцатеричное число, и возвращает десятичное значение, и, как и до этого момента, $hex когда-либо использовалось только как число, Perl будет сначала преобразовать в строку $hex затем передайте строку в функцию hex(), чтобы преобразовать это значение из шестнадцатеричного в десятичное.

Итак, к решению. Вы почти там с printf(), есть функция с именем sprintf(), которая принимает те же параметры, что и printf(), но вместо печати отформатированное значение возвращает его в виде строки. Так что вам нужно.

my $hex = 0xFA1F;
my $bin = sprintf("%b", $hex);
print $bin;

Техническое примечание: Да, я знаю, что Perl хранит все свои числа как двоичные, но не пойдет туда для этого ответа, хорошо?

...