因此,我知道有一些库可以为我做到这一点,但我想学习包/解包。
我的目标是让用户输入一个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,所以很明显,我不明白这里发生了什么。
这到底是怎么回事?
发布于 2016-02-11 06:56:34
pack ("N*", $ip)从$ip中提取一个整数,并将其按网络字节顺序排列。
您想要的是将IP地址的4个十进制八位数打包为二进制。不需要摆弄endianness,因为IP地址字符串已经在大端(最高顺序的字节已经在字符串的开头)。
我还将*更改为4,IP地址总是4字节长:
$ip = "192.168.1.1";
$bi = pack "C4", split('\.', $ip);
print join('.', unpack("C4",$bi)), "\n";https://stackoverflow.com/questions/35332535
复制相似问题