Иногда возникает потребность в переводе 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)