2016-02-11 46 views
1

所以我知道有些库可以为我做到这一点,但我想学习打包/解压缩。了解包/解包perl

我的目标是我有一个用户输入一个IP地址/子网掩码,然后验证它是有效的。

我认为这样做的一种方式是“sprintf”并获得二进制值可以说192.168.1.1。这是一个好的解决方案,但然后我需要预先安排所需的0的数量吨使它'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(全部);'! (“'Argument”192.168.1.1“在包中不是数字”) – ikegami

回答

4

pack ("N*", $ip)从$ ip中取出一个整数并将其放入网络字节顺序中。

你想要的是将IP地址的4个十进制字节打包为二进制。由于IP地址字符串已经是big endian(最高字节已经在字符串的开头),所以不需要摆弄字节序。

我也改变了*4,IP地址总是4个字节长:

$ip = "192.168.1.1";  
$bi = pack "C4", split('\.', $ip); 
print join('.', unpack("C4",$bi)), "\n";