2008-10-21 2 views
7

4 바이트 네트워크 주문 IPv4 주소 (pack 및 정수 표현을 사용하여 생성 된)가 포함 된 변수가 있습니다. 나는 또 다른 변수 인 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을 더하는 것입니다. 4 번째 바이트는 무엇입니까? 즉, 문자열 \n\r&\0을 가져오고 문자열 \n\r&\1으로 끝내기를 원합니다. 그 일을하는 가장 간단한 방법은 무엇입니까?

변수를 압축 해제하고 다시 채우지 않고도이 작업을 수행 할 수 있습니까?

답변

13

$ip&$netmask으로 바이트 문자열을 만든 다음 숫자로 처리하려고합니다. 이것은 그렇게 작동하지 않습니다. inet_ntoa에 무엇을 먹이세요.

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

나는 그것을하는 더 쉬운 방법이 없다고 생각합니다.

+0

나는 당신이 옳은 것 같아요. 더 단순한 방법이 있는지 알아 내려고했지만, 아아, 없을 수도 있습니다. –

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 
관련 문제