Perl: Bin=>Dec и Dec=>Bin преобразования
Проблема
Имеется десятичное число, которое необходимо вывести в двоичном представлении, или наоборот, двоичная последовательность, которую требуется преобразовать в десятичное число. Такие задачи часто возникают при отображении нетекстовых данных - например, полученных в процессе взаимодействия с некоторыми системными функциями и программами.
Решение
Чтобы преобразовать целое число Perl в строку, состоящую из единиц и нулей, сначала упакуйте его в сетевой формат "N" (с начальным старшим байтом), а затем снова распакуйте по одному биту (формат "В32").
Чтобы преобразовать строку из единиц и нулей в целое число Perl, дополнив ее необходимым колличеством нулей, а затем выполните описанную выше процедуру в обратном порядке:
Комментарий
Речь идет о преобразовании чисел между строками вида "00100011" и десятичной системой счисления (35). Строка содержит двоичное представление числа. На этот раз функция sprintf не поможет: в ней не предусмотрен формат для вывода чисел в двоичной системе счисления. Следовательно, нам придется прибегнуть к функциям Perl pack и unpack для непосредственных манипуляций со строковыми данными. Функции pack и unpack предназначены для работы со строками.
Строки можно интерпретировать как последовательности битов, байты, целые, длинные целые, числа с плавающей запятой в представлении IEEE, контрольные суммы - не говоря уже о многом другом. Обе функции, pack и unpack, по аналогии со sprintf получают форматную строку, которая определяет выполняемые с аргументом операции. Мы используем pack и unpack для интерпретации строк как последовательностей битов и двоичного представления целого числа. Чтобы понять, каким образом строка интерпретируется как последовательность битов, необходимо хорошо разобраться в поведении функции pack. Строка интерпретируется как последовательность байтов, состоящих из восьми бит.
Байты всегда нумеруются слево направо (первые восемь бит образуют первый байт, следующие восемь бит - второй и т. д.), однако внутри каждого байта биты могут нумероваться как слева направо, так и справа налево. Функция pack с шаблоном "В" работает с битами каждого байта, пронумерованными слева направо. Именно в этом порядке они должны находиться для применения формата "N", которым мы воспользуемся для интерпретации последовательности битов как 32-разрядного целого.
Взято из Perl Cookbook: Том Кристиансен, Натан Торкингтон. Perl. Сборник рецептов. Для профессионалов. 2004
Имеется десятичное число, которое необходимо вывести в двоичном представлении, или наоборот, двоичная последовательность, которую требуется преобразовать в десятичное число. Такие задачи часто возникают при отображении нетекстовых данных - например, полученных в процессе взаимодействия с некоторыми системными функциями и программами.
Решение
Чтобы преобразовать целое число 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