Perl Decimal to Binary 32-битный, затем 8-битный

У меня есть число (3232251030), которое нужно перевести из десятичного в двоичный. Как только я получил двоичный файл, мне нужно разделить его 8 бит на цифры, чтобы получить IP-адрес.

Преобразование десятичного числа в двоичное просто:

sub dec2bin { my $str = unpack("B32", pack("N", shift)); $str =~ s/^0+(?=\d)//; # otherwise you'll get leading zeros return $str; }

sub bin2dec { return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); }

e.g. $num = bin2dec('0110110'); # $num is 54 $binstr = dec2bin(54); # $binstr is 110110

Ссылка: http://www.perlmonks.org/?node_id=2664

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

$num = dec2bin('3232251030');

($num — это «11000000 10101000 01000100 00001110» в двоичном формате)

Мне нужно разделить и сохранить каждые 8 ​​бит «11000000 10101000 01000100 00001110» в «192.168.60.150».

Хотите совет? Я ищу функцию разделения для этого.


person LynxLee    schedule 24.06.2011    source источник
comment
Вы уверены, что вам действительно нужен весь этот двоичный этап? Похоже, вы просто хотите превратить строку в целое число, а затем распаковать ее в байты.   -  person Gabe    schedule 24.06.2011
comment
У меня есть целое число, которое я хочу превратить в двоичное, а затем обработать каждые 8 ​​бит как отдельные числа, чтобы сформировать IP-адрес (xxx.xxx.xxx.xxx).   -  person LynxLee    schedule 24.06.2011
comment
Ссылка на книгу на сайте .ua почти гарантированно является нелегальной копией.   -  person ysth    schedule 24.06.2011


Ответы (2)


На самом деле вам не нужно преобразовывать в двоичную строку, просто в 32-битное целое число:

print join '.', unpack('CCCC', pack('N', 3232251030));

напечатает 192.168.60.150

person Gabe    schedule 24.06.2011
comment
Или просто 'C*' вместо 'CCCC'. - person cjm; 24.06.2011
comment
Гоша; так просто? И здесь я пытаюсь придумать так много методов. Спасибо! Я начну узнавать больше об упаковке и распаковке. Так круто. знак равно - person LynxLee; 24.06.2011

say join('.', unpack('C4', pack('N', 3232251030)));

и

use Socket qw( inet_ntoa );
say inet_ntoa(pack('N', 3232251030));

оба выхода

192.168.60.150
person ikegami    schedule 24.06.2011
comment
+1 для модуля сокетов. pack не показывает намерение кода, используя соответствующий модуль. Как только код нужно будет изменить, чтобы приспособить его к IPv6, программисту сопровождения придется нелегко с кодом pack из-за его низкого уровня абстракции, тогда как с модулем это просто еще один вызов функции. - person daxim; 24.06.2011
comment
@daxim: Как избежать вызова pack? Даже использование inet_ntoa требует pack. - person Gabe; 24.06.2011
comment
Я сделал ошибку, извиняюсь. s/pack/unpack/ и вы понимаете, о чем я - person daxim; 24.06.2011
comment
@Gabe действительно прав. Мы имеем дело с адресом IPv4, и мы должны знать, что имеем дело с адресом IPv4, чтобы создать правильную строку байтов для inet_ntoa или join+unpack. С другой стороны, @daxim также считает, что использование inet_ntoa проясняет ситуацию и обеспечивает лучший путь обновления, хотя бы для половины фрагмента. - person ikegami; 25.06.2011
comment
@daxim: Вся идея преобразования 32-битных десятичных чисел в IP-адреса означает, что она с самого начала довольно несовместима с IPv6. - person Gabe; 25.06.2011