PHP에서 ip2long을 사용할 때 음수 문제를 해결하는 방법은 무엇입니까? 이 기사에서는 주로 php ip2long에서 음수가 발생하는 이유와 해결 방법을 소개합니다. 모든 사람과 공유하고 참고용으로 제공하세요. 그것이 모두에게 도움이 되기를 바랍니다.
php는 IP 주소를 처리하는 ip2long 및 long2ip 방법을 제공합니다.
1, ip2long - IPV4 문자열 인터넷 프로토콜을 디지털 형식으로 변환합니다.
int ip2long ( string $ip_address )
매개변수: ip_address 표준 형식의 주소입니다.
반환 값: IP 주소의 변환된 숫자를 반환하거나 ip_address가 잘못된 경우 FALSE를 반환합니다.
2, long2ip - 숫자 형식을 IPV4 문자열 인터넷 프로토콜로 변환
string long2ip ( string $proper_address )
매개 변수: proper_address 긴 정수의 올바른 주소 표현입니다.
반환 값: 인터넷 주소를 문자열로 반환합니다.
3. 사용 방법
<?php $ip = '10.1.1.1'; $ip_long = ip2long($ip); echo $ip_long.PHP_EOL; // 167837953 echo long2ip($ip_long); // 10.1.1.1 ?>
4. 음수에 대한 이유와 해결책
IP 주소가 상대적으로 크면 ip2long은 음수를 갖게 됩니다:
<?php $ip = '192.168.101.100'; $ip_long = ip2long($ip); echo $ip_long.PHP_EOL; // -1062705820 echo long2ip($ip_long); // 192.168.101.100 ?>
이유 설명:
IPv4는 부호 없는 32비트 주소를 사용하므로 최대 2의 32승 - 1(4294967295) 주소가 있습니다. 소수점 4자리로 구분하여 십진수를 씁니다.
A.B.C.D로 표시됩니다(예: 192.168.100.100).
IPv4 주소의 각 10진수는 0부터 255까지의 부호 없는 바이트입니다. IPv4 주소를 부호 없는 숫자로 변환한다는 것은 실제로 각 10진수를 해당 8비트에 배치하는 것을 의미합니다. 4바이트 부호 없는 정수를 형성합니다. 192.168.100.100, 상위 8자리는 192,168, 하위 8자리는 100,100입니다.
C 구현 예:
#include <stdio.h> int main(int argc, char** argv) { unsigned int ip_long = (192 << 24) | (168 << 16) | (100 << 8) | 100; printf("%u\n", ip_long); printf("%d\n", ip_long); return 0; } fdipzone@ubuntu:~/C$ gcc -o ip2long ip2long.c fdipzone@ubuntu:~/C$ ./ip2long 3232261220 -1062706076
ip_long이 부호 없는 정수로 선언되더라도 출력을 부호 없는 정수로 형식화하려면 출력할 때 %u를 지정해야 한다는 것을 알 수 있습니다.
192는 127(2진수는 01111111)보다 크기 때문에 192(8비트)는 2진수로 표현되며, 최상위 비트는 1이 되어야 합니다. 결과적으로 이 4바이트 정수의 가장 높은 비트는 1입니다.
ip_long은 부호 없는 정수로 정의되어 있지만 printf 메서드는 선언을 무시합니다. 따라서 출력에는 %u 형식을 사용해야 합니다. 가장 높은 비트가 0이면 %d를 사용하세요.
또 다른 예:
ip:112.24.55.99 #include <stdio.h> int main(int argc, char** argv) { unsigned int ip_long = (112 << 24) | (24 << 16) | (55 << 8) | 99; printf("%u\n", ip_long); printf("%d\n", ip_long); return 0; } fdipzone@ubuntu:~/C$ gcc -o ip2long ip2long.c fdipzone@ubuntu:~/C$ ./ip2long 1880635235 1880635235
해결책:
출력할 때 부호 없는 정수로 형식을 지정하려면 %u를 사용하세요.
<?php $ip = '192.168.101.100'; $ip_long = sprintf('%u',ip2long($ip)); echo $ip_long.PHP_EOL; // 3232261476 echo long2ip($ip_long); // 192.168.101.100 ?>
관련 권장 사항:
PHP는 어떻게 사용자 클라이언트의 실제 IP를 얻습니까?
위 내용은 PHP가 ip2long을 사용할 때 음수에 대한 해결책의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!