Автор Тема: IP-адрес в число и обратно  (Прочитано 29156 раз)

Марахтанов Алексей

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 205
    • marahtanov.ru
IP-адрес в число и обратно
« : 10 Апреля 2011, 02:43:46 »
Иногда возникает потребность в переводе IP адреса (v4) в целое число:
- требуется сравнение адресов, например, поиск принадлежности адреса диапазону
- требуется сократить место, занимаемое для хранения IP-адреса в базе данных.

Естественно, в таком случае может быть актуальной и обратная задача, то есть перевод из числа в строковый IP-адрес вида "123.123.123.123".

Технически преобразование IP-адреса в число, как правило, осуществляют так:
X = Y1 * 256 ^ 0 + Y2 * 256 ^ 1 + Y3 * 256 ^ 2 + Y4 * 256 ^3 (где ip адрес имеет формат Y4.Y3.Y2.Y1)

Вот некоторые подходы к решению этой задачи в различных языках программирования (и в базе данных).

1. На PHP, встроенные функции (версия 4 и выше)

ip2long (http://php.net/manual/en/function.ip2long.php)
long2ip (http://www.php.net/manual/en/function.long2ip.php)

2. На PHP, пользовательское решение

// в число  ($ip к $intip)
   $a=explode(".",$ip);
   $intip = $a[0]*256*256*256+$a[1]*256*256+$a[2]*256+$a[3];

// в строку ($intip к $ip)

   $d[0]=(int)($intip/256/256/256);
   $d[1]=(int)(($intip-$d[0]*256*256*256)/256/256);
   $d[2]=(int)(($intip-$d[0]*256*256*256-$d[1]*256*256)/256);
   $d[3]=$intip-$d[0]*256*256*256-$d[1]*256*256-$d[2]*256;
   $ip = "$d[0].$d[1].$d[2].$d[3]";

3. На perl, пользовательское решение

# в число  ($ip к $intip)
@a = split("/\./",$ip);
$intip = int($a[0])*256*256*256+int($a[1])*256*256+int($a[2])*256+int($a[3]);

#в строку ($intip к $ip)
$d = $intip % 256; $intip -= $d; $intip /= 256;
$c = $intip % 256; $intip -= $c; $intip /= 256;
$b = $intip % 256; $intip -= $b; $intip /= 256;
$ip="$intip.$b.$c.$d";

4. На perl, с помощью библиотеки

Net::IP (http://search.cpan.org/dist/Net-IP/IP.pm)

5. На уровне базы данных MySQL

функция INET_ATON (http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton)
функция INET_NTOA (http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-ntoa)

« Последнее редактирование: 10 Апреля 2011, 02:45:30 от Марахтанов Алексей »