>백엔드 개발 >PHP 튜토리얼 >PHP가 ip2long을 사용할 때 음수에 대한 해결책

PHP가 ip2long을 사용할 때 음수에 대한 해결책

*文
*文원래의
2018-01-02 17:16:001867검색

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 = &#39;10.1.1.1&#39;;
$ip_long = ip2long($ip);
echo $ip_long.PHP_EOL; // 167837953
echo long2ip($ip_long); // 10.1.1.1
?>

4. 음수에 대한 이유와 해결책

IP 주소가 상대적으로 크면 ip2long은 음수를 갖게 됩니다:

<?php
$ip = &#39;192.168.101.100&#39;;
$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 = &#39;192.168.101.100&#39;;
$ip_long = sprintf(&#39;%u&#39;,ip2long($ip));
echo $ip_long.PHP_EOL; // 3232261476 
echo long2ip($ip_long); // 192.168.101.100
?>

관련 권장 사항:

PHP는 어떻게 사용자 클라이언트의 실제 IP를 얻습니까?

PHP는 솔트 처리된 이미지 암호화를 구현합니다.

PHP가 MySQL 연결 끊김을 처리하는 방법

위 내용은 PHP가 ip2long을 사용할 때 음수에 대한 해결책의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.