Perl의 이진 문자열에 하나를 추가하는 가장 간단한 방법은 무엇입니까?
문제
4 바이트, 네트워크 주문 IPv4 주소가 포함 된 변수가 있습니다 (이것은 팩과 정수 표현을 사용하여 생성되었습니다). 다른 변수, 4 바이트 네트워크 주문 서브넷도 있습니다. 서브넷에서 첫 번째 IP를 얻기 위해 함께 추가하고 하나를 추가하려고합니다.
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
. 가장 간단한 방법은 무엇입니까?
변수를 포장하고 다시 포장하지 않고도이를 수행하는 방법이 있습니까?
해결책
무슨 일이 일어나고 있는지 $ip&$netmask
, 그런 다음 숫자로 취급하십시오. 이것은 작동하지 않을 것입니다. 먹이를 먹어야 할 것 inet_ntoa
이다.
pack("N", unpack("N", $ip&$netmask) + 1)
나는 그것을하는 더 간단한 방법이 있다고 생각하지 않습니다.
다른 팁
혼란스러운 정수와 현. 아마도 다음 코드가 도움이 될 것입니다.
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
제휴하지 않습니다 StackOverflow