了解打包/解包 perl
Understanding pack / unpack 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
所以显然我不明白这里发生了什么。
这里到底发生了什么?
pack ("N*", $ip)
从 $ip 中取出一个整数并将其放入网络字节顺序。
您想要的是将 IP 地址的 4 个十进制八位字节打包为二进制。不需要 fiddle 字节序,因为 IP 地址字符串已经是大端字节序(最高位字节已经在字符串的开头)。
我还将 *
更改为 4
,IP 地址始终为 4 个八位字节长:
$ip = "192.168.1.1";
$bi = pack "C4", split('\.', $ip);
print join('.', unpack("C4",$bi)), "\n";
所以我知道有些库可以为我做这件事,但我想学习打包/解包。
我的目标是让用户输入一个 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
所以显然我不明白这里发生了什么。
这里到底发生了什么?
pack ("N*", $ip)
从 $ip 中取出一个整数并将其放入网络字节顺序。
您想要的是将 IP 地址的 4 个十进制八位字节打包为二进制。不需要 fiddle 字节序,因为 IP 地址字符串已经是大端字节序(最高位字节已经在字符串的开头)。
我还将 *
更改为 4
,IP 地址始终为 4 个八位字节长:
$ip = "192.168.1.1";
$bi = pack "C4", split('\.', $ip);
print join('.', unpack("C4",$bi)), "\n";