2016-02-11 42 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";