2016-02-11 3 views
1

, поэтому я знаю, что есть библиотеки, которые могут это сделать для меня, но я хочу изучить пакет/распаковать.Понимание пакета/unpack perl

Моя цель У меня есть пользовательский адрес IP-адрес/маску подсети, а затем убедитесь, что он действителен.

В одну сторону я думал о том, что это было «sprintf» и получить двоичное значение let say 192.168.1.1. это одобренное решение, но тогда мне нужно добавить требуемое количество 0's t сделать его «8 бит»

Это похоже на много ненужной работы, когда pack может помещать вещи в двоичный формат. Я использовал шаблон N, который нашел http://perldoc.perl.org/functions/pack.html. Мой первый гол состоял в том, чтобы получить ip-адрес, преобразовать его в двоичный, а затем преобразовать обратно.

$ip = "192.168.1.1";  
$bi = pack ("N*", $ip);  
print unpack("N*",$bi),"\n"; 

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

что именно здесь происходит?

+1

Всегда используйте 'использовать строгий; использовать предупреждения qw (все); '! («Аргумент» 192.168.1.1 «не является числовым в пакете») – ikegami

ответ

4

pack ("N*", $ip) принимает целое число из $ ip и помещает его в сетевой порядок байтов.

Что вы хотите, это упаковывать 4 десятичных десятичных байта IP-адреса в виде двоичных файлов. Нет необходимости возиться с контентом, поскольку строка IP-адреса уже находится в большом значении (старший байт уже находится в начале строки).

Я также изменил * к 4, IP-адреса всегда 4 октетов:

$ip = "192.168.1.1";  
$bi = pack "C4", split('\.', $ip); 
print join('.', unpack("C4",$bi)), "\n"; 
Смежные вопросы