2008-10-21 21 views
7

4 bayt, ağ siparişi IPv4 adresi içeren bir değişkenim var (bu, paket ve tamsayı gösterimi kullanılarak oluşturuldu). Başka bir değişkenim var, ayrıca bir 4 bayt ağ sırası, alt ağ var. Bunları bir araya getirmeye çalışıyorum ve alt ağdaki ilk IP'yi almak için bir tane ekliyorum.Perl'de bir ikili dizgiye eklenmesinin en basit yolu nedir?

ASCII gösterimini almak için, temel adresi almak için inet_ntoa($ip&$netmask) yapabilirim, ancak bu hata inet_ntoa((($ip&$netmask)+1); Ben olsun bir mesaj gibi: Yani

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

söyleyebilirim neler, en önemlisi de bu 4 bayt bakıyor ve 4 byte sayısal dize temsil etmediğini görerek, sonra reddediyor edilir add 1.

Başka bir ifade koyma yöntemi: Bunu yapmak istediğim, 4 bayt olduğunu bildiğim en az anlamlı byte'a 1 eklemektir? Yani, \n\r&\0 dizesini alıp \n\r&\1 dizesiyle sonlandırmak istiyorum. Bunu yapmanın en basit yolu nedir?

Değişkenin paketini açıp tekrar paketlemek zorunda kalmadan bunu yapmanın bir yolu var mı?

cevap

13

Neler oluyor: $ip&$netmask ile bir bayt dizesi oluşturup, bir sayı olarak işlemeye çalışın. Bu, böyle çalışmayacak. inet_ntoa'a ne beslemeniz gerekiyor.

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

Bunu yapmanın daha basit bir yolu olduğunu sanmıyorum.

+0

Sana haklı olabilir. Sadece daha basit bir yol olup olmadığını görmeye çalışıyordum, ama ne yazık ki olmayabilir. –

8

Tam sayılarla ve dizelerle karıştırılıyor. Belki şu kod yardımcı olacaktır:

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"; 

verir Hangi:

192.168.250.1 
İlgili konular