2008-10-21 102 views
7

我有一個變量,其中包含一個4字節的網絡順序IPv4地址(這是使用包和整數表示形式創建的)。我有另一個變量,也是一個4字節的網絡順序子網。我試圖將它們添加在一起並添加一個以獲取子網中的第一個IP。在Perl中添加二進制字符串的最簡單方法是什麼?

爲了得到ASCII碼錶示,我可以做inet_ntoa($ip&$netmask)來獲得基地址,但這是一個錯誤inet_ntoa((($ip&$netmask)+1);我得到一個消息,如:

Argument "\n\r&\0" isn't numeric in addition (+) at test.pm line 95. 

所以發生了什麼,最好的我所知道的,是它的看着4個字節,而當看到4個字節不表示一個數字字符串,然後拒絕加1。

把它放在另一種方式:我想要它做的是加1到最低有效字節,我知道是第四個字節?也就是說,我想要字符串\n\r&\0並以字符串\n\r&\1結尾。這樣做最簡單的方法是什麼?

有沒有辦法做到這一點,而無需解壓縮和重新包裝變量?

回答

13

發生了什麼事情是,你用$ip&$netmask做一個字節字符串,然後嘗試把它當作一個數字。這不會起作用,因此。你必須餵給inet_ntoa是。

pack("N", unpack("N", $ip&$netmask) + 1) 

我不認爲有一個更簡單的方法來做到這一點。

+0

我想你可能是正確的。只是試圖看看是否有更簡單的方法,但唉,可能沒有。 – 2008-10-21 14:44:48

8

混淆整數和字符串。也許下面的代碼將有助於:

use Socket; 

$ip = pack("C4", 192,168,250,66); # why not inet_aton("192.168.250.66") 
$netmask = pack("C4", 255,255,255,0); 

$ipi = unpack("N", $ip); 
$netmaski = unpack("N", $netmask); 

$ip1 = pack("N", ($ipi&$netmaski)+1); 
print inet_ntoa($ip1), "\n"; 

,輸出:

192.168.250.1 
相關問題