Perl의 이진 문자열에 하나를 추가하는 가장 간단한 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/222043

  •  03-07-2019
  •  | 
  •  

문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top