PHP에서 IP2Long () 함수는 IP 주소 (예 : 192.168.1.1 )를 긴 정수로 변환하는 데 널리 사용됩니다. 일반적 으로이 기능은 네트워크 프로그래밍에 사용됩니다. 특히 IP 주소를 저장하거나 비교 해야하는 경우 IP 주소를 쉽게 처리하기 위해 IP 주소를 정수로 변환 할 수 있습니다. 그러나 이러한 변환 된 정수에 대한 수학 연산을 직접 수행 할 수 있습니까? 이 기사에서는이 문제에 대해 자세히 논의하고 특정 상황을 분석 할 것입니다.
PHP의 IP2Long () 함수는 IPv4 주소를 32 비트 서명되지 않은 정수로 변환합니다. IPv4 주소는 4 바이트로 구성되며 IP2Long ()은 이러한 바이트를 정수로 순서대로 변환하여 달성됩니다.
예를 들어, IP 주소 192.168.1.1 이 있다고 가정하면 ip2long () 함수를 호출하면 정수를 반환합니다.
<span><span><span class="hljs-variable">$ip</span></span><span> = </span><span><span class="hljs-string">'192.168.1.1'</span></span><span>;
</span><span><span class="hljs-variable">$long</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$long</span></span><span>; </span><span><span class="hljs-comment">// 출력 결과:3232235777</span></span><span>
</span></span>위의 예에서, 192.168.1.1은 정수 3232235777 로 변환됩니다.
IP2Long () 함수는 32 비트 서명되지 않은 정수를 반환합니다. 32 비트 정수의 표현 범위에 따르면 그 값은 0 에서 4294967295 사이 여야합니다. 이는 IP2Long () 변환의 결과가 0보다 큰 정수임을 의미합니다. 더 큰 값 (예 : IPv6)을 처리하려면 다른 메커니즘을 사용해야합니다.
IP2Long () 에서 변환 된 정수는 본질적으로 32 비트 정수이며, 이러한 정수는 PHP의 수학적 작업에 직접 참여할 수 있습니다. PHP의 INT 유형은 대부분의 시스템에서 서명 된 32 비트 정수이므로 추가, 뺄셈, 곱셈 및 분할과 같은 일반적인 수학 연산에 사용할 수 있습니다.
예를 들어, IP로 변환 된 정수를 추가하거나 빼낼 수 있습니다.
<span><span><span class="hljs-variable">$ip1</span></span><span> = </span><span><span class="hljs-string">'192.168.1.1'</span></span><span>;
</span><span><span class="hljs-variable">$ip2</span></span><span> = </span><span><span class="hljs-string">'192.168.1.2'</span></span><span>;
</span><span><span class="hljs-variable">$long1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip1</span></span><span>);
</span><span><span class="hljs-variable">$long2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip2</span></span><span>);
</span><span><span class="hljs-variable">$sum</span></span><span> = </span><span><span class="hljs-variable">$long1</span></span><span> + </span><span><span class="hljs-variable">$long2</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$sum</span></span><span>; </span><span><span class="hljs-comment">// 출력 2 IP 주소의 번역 된 정수</span></span><span>
</span></span>결과가 PHP 정수 유형의 표현 범위를 초과하지 않는 경우이 유형의 작동은 유효합니다. 일반적으로 계산 결과는 합리적인 범위 내에 있습니다.
그러나 매우 큰 수학 작업을 수행하면 PHP 정수 오버플로 문제가 발생할 수 있습니다. PHP는 다른 시스템 (일반적으로 32 비트 또는 64 비트)에서 다른 크기의 정수를 사용합니다. 일부 32 비트 시스템은 특히 매우 많은 수를 다룰 때 정수 오버플로를 경험할 수 있습니다.
예를 들어, 첨가 또는 곱셈 결과가 32 비트 정수 ( 4294967295 )의 최대 값을 초과하면 오버플로가 발생할 수있어 계산 결과가 잘못 될 수 있습니다. 따라서 IP2Long () 에 의해 변환 된 정수는 수학 연산에 직접 참여할 수 있지만 대규모 작업을 수행 할 때 가능한 오버플로 문제에주의를 기울여야합니다.
PHP에서 정수의 값이 시스템 정수 범위를 초과하면 PHP는 자동으로 부동 소수점 번호로 변환합니다. 이는 특히 복잡한 작업을 수행 할 때 정확도 손실로 이어질 수 있습니다. 예를 들어:
<span><span><span class="hljs-variable">$ip1</span></span><span> = </span><span><span class="hljs-string">'255.255.255.255'</span></span><span>;
</span><span><span class="hljs-variable">$ip2</span></span><span> = </span><span><span class="hljs-string">'0.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$long1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip1</span></span><span>);
</span><span><span class="hljs-variable">$long2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ip2long</span></span><span>(</span><span><span class="hljs-variable">$ip2</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$long1</span></span><span> + </span><span><span class="hljs-variable">$long2</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>; </span><span><span class="hljs-comment">// 정확도 문제가 발생할 수 있습니다</span></span><span>
</span></span>이 예에서 IP 주소의 정수 값이 너무 크면 PHP는 부동 소수점 번호로 변환하지만 부동 소수점 번호의 정확도 제한으로 인해 최종 계산 결과가 오류 될 수 있습니다.
정수 오버플로 및 정밀 손실을 피하기 위해 다음 방법을 채택 할 수 있습니다.
64 비트 정수 사용 : 환경에서 64 비트 정수를 지원하는 경우 작업이 정수 범위를 초과하지 않도록 할 수 있습니다. PHP_INT_SIZE 를 통해 현재 PHP 환경에서 지원하는 정수 크기를 확인할 수 있습니다.
<span><span><span class="hljs-keyword">echo</span></span><span> PHP_INT_SIZE; </span><span><span class="hljs-comment">// 4 또는 8,시스템 아키텍처에 따라 다릅니다</span></span><span>
</span></span>GMP 또는 BC 수학 확장 사용 : 더 큰 값의 경우 PHP는 임의의 정밀도의 정수 및 플로팅 포인트 계산을 지원하는 GMP 및 BC 수학 확장 라이브러리를 제공하여 오버플로 및 정밀도 손실을 피하십시오.
예를 들어, gmp_add ()를 사용하면 고정화 첨가를 수행 할 수 있습니다.
<span><span><span class="hljs-variable">$gmp1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$long1</span></span><span>);
</span><span><span class="hljs-variable">$gmp2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$long2</span></span><span>);
</span><span><span class="hljs-variable">$gmpSum</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_add</span></span><span>(</span><span><span class="hljs-variable">$gmp1</span></span><span>, </span><span><span class="hljs-variable">$gmp2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">gmp_strval</span></span><span>(</span><span><span class="hljs-variable">$gmpSum</span></span><span>);
</span></span>IP2Long () 함수가 IP 주소를 정수로 변환 한 후 일반적으로 수학 연산에 직접 사용할 수 있습니다. 대부분의 경우, 이러한 정수는 PHP의 정수 범위를 초과하지 않으므로 추가, 뺄셈, 곱셈 및 분할과 같은 작업을 수행 할 수 있습니다. 그러나 경우에 따라, 특히 많은 숫자를 수행 할 때는 오버플로 및 정확도 문제에주의를 기울여야합니다. 이러한 문제를 피하려면 GMP 또는 BC 수학 확장과 같은 64 비트 정수 또는 PHP의 고정 장치 수학 확장을 고려하십시오.
정수에 대한 PHP의 처리 메커니즘을 이해하고 Extension 라이브러리를 합리적으로 사용함으로써 IP 주소 변환 후 수학 작업을 수행 할 때 데이터 오버플로 또는 정확도 손실로 인해 오류 결과가 없도록 보장 할 수 있습니다.