理解pack / unpack perl

gen*_*mx6 2 perl pack

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

我的目标是让用户输入一个 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";
Run Code Online (Sandbox Code Playgroud)

我得到的输出192很明显我不明白这里发生了什么。

这里到底发生了什么?

a3f*_*a3f 5

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

您想要的是将 IP 地址的 4 个十进制八位字节打包为二进制。无需摆弄字节序,因为 IP 地址字符串已经是大字节序(最高位字节已经在字符串的开头)。

我也将其更改*为 a 4,IP 地址始终为 4 个八位字节长:

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