S3.Blog

23 Марта 2017
A A A   RSS-лента
"Я знаю, что ничего не знаю, но многие не знают и этого". Сократ [?].

Perl: Bin=>Dec и Dec=>Bin преобразования

Дата последнего изменения: 10 Апреля 2011
Метки статьи: Готовые решения, Perl
Проблема

Имеется десятичное число, которое необходимо вывести в двоичном представлении, или наоборот, двоичная последовательность, которую требуется преобразовать в десятичное число. Такие задачи часто возникают при отображении нетекстовых данных - например, полученных в процессе взаимодействия с некоторыми системными функциями и программами.
 

Решение

Чтобы преобразовать целое число Perl в строку, состоящую из единиц и нулей, сначала упакуйте его в сетевой формат "N" (с начальным старшим байтом), а затем снова распакуйте по одному биту (формат "В32").
sub dec2bin {
    my $str = unpack("B32", pack("N", shift));
    $str =~ s/^0+C7=\d)//; # В противном случае появятся начальные нули
    return $str;
}

Чтобы преобразовать строку из единиц и нулей в целое число Perl, дополнив ее необходимым колличеством нулей, а затем выполните описанную выше процедуру в обратном порядке:
sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 , shift, -32)));
}

Комментарий

Речь идет о преобразовании чисел между строками вида "00100011" и десятичной системой счисления (35). Строка содержит двоичное представление числа. На этот раз функция sprintf не поможет: в ней не предусмотрен формат для вывода чисел в двоичной системе счисления. Следовательно, нам придется прибегнуть к функциям Perl pack и unpack для непосредственных манипуляций со строковыми данными. Функции pack и unpack предназначены для работы со строками.
Строки можно интерпретировать как последовательности битов, байты, целые, длинные целые, числа с плавающей запятой в представлении IEEE, контрольные суммы - не говоря уже о многом другом. Обе функции, pack и unpack, по аналогии со sprintf получают форматную строку, которая определяет выполняемые с аргументом операции. Мы используем pack и unpack для интерпретации строк как последовательностей битов и двоичного представления целого числа. Чтобы понять, каким образом строка интерпретируется как последовательность битов, необходимо хорошо разобраться в поведении функции pack. Строка интерпретируется как последовательность байтов, состоящих из восьми бит.
Байты всегда нумеруются слево направо (первые восемь бит образуют первый байт, следующие восемь бит - второй и т. д.), однако внутри каждого байта биты могут нумероваться как слева направо, так и справа налево. Функция pack с шаблоном "В" работает с битами каждого байта, пронумерованными слева направо. Именно в этом порядке они должны находиться для применения формата "N", которым мы воспользуемся для интерпретации последовательности битов как 32-разрядного целого.

$num = bin2dec('0110110'); # $num = 54
$binstr = dec2bin(54); # $binstr = 110110

Взято из Perl Cookbook: Том Кристиансен, Натан Торкингтон. Perl. Сборник рецептов. Для профессионалов. 2004


Похожие материалы:




cynovg (гость) • ответить
perl -e 'printf "%b\n", 35'
Александрответить
то же вариант

 
 
  Имя *:   Решите пример *: =
 
Полужирный Курсив Подчеркнутый Перечеркнутый
 
Вставить изображение Сделать цитатой Вставить ссылку Вставить код

Вставить смайл
 
 

 



© S3.Blog: Если критикуешь, не предлагая решения проблемы, то ты становишься частью этой проблемы.