Как известно, при переводе IP-адреса в число, мы экономим ресурсы памяти, так как IP-адрес в четвертой версии — это 32-х битовое число и запись вида 192.168.1.1 будет занимать 15 байт, а в числовом виде всего 4 байта. Удобной формой записи (
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!--PHP code --> function int2ip($i) { $d[0]=(int)($i/256/256/256); $d[1]=(int)(($i-$d[0]*256*256*256)/256/256); $d[2]=(int)(($i-$d[0]*256*256*256-$d[1]*256*256)/256); $d[3]=$i-$d[0]*256*256*256-$d[1]*256*256-$d[2]*256; return "$d[0].$d[1].$d[2].$d[3]"; } function ip2int($ip) { $a=explode(".",$ip); return $a[0]*256*256*256+$a[1]*256*256+$a[2]*256+$a[3]; } <!--End PHP code --> |
В PHP есть встроенная функция перевода из IP в число — ip2long, но по умолчанию она переводит в отрицательные числа.
1 2 3 4 5 6 7 8 |
<!--?php $ip = gethostbyname('www.example.com'); $long = ip2long($ip); if ($long == -1 || $long === FALSE) { echo 'Неверный IP, попробуйте еще раз'; } else { echo $ip . "\n"; // 192.0.34.166 echo $long . "\n"; // -1073732954 printf("%u\n", ip2long($ip)); // 3221234342 } ?--> |
Ввиду того, что PHP тип integer является знаковым, и на 32-битных системах большое количество IP адресов будет представлено в виде отрицательных чисел, необходимо использовать «%u» в функции sprintf() или printf() для получения IP адреса в строковом беззнаковом виде.
Теперь рассмотрим функцию перевода из числа обратно в IP-адрес, на примере MSSQL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/*MSSql cpde code*/ USE [ARMScan] GO /****** Object: UserDefinedFunction [dbo].[udf_int2IP] Script Date: 02/24/2015 09:27:30 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER function [dbo].[udf_int2IP] (@ip bigint) returns varchar(18) as begin declare @d1 bigint declare @d2 bigint declare @d3 bigint declare @d4 bigint declare @ipstr varchar (18) set @d1= (@ip/256/256/256) set @d2= (@ip-@d1*256*256*256)/256/256 set @d3= (@ip-@d1*256*256*256-@d2*256*256)/256 set @d4= @ip-@d1*256*256*256-@d2*256*256-@d3*256 set @ipstr=((CAST (@d1 as varchar(3)) +'.'+ CAST (@d2 as varchar(3))+'.'+ CAST (@d3 as varchar(3))+'.'+ CAST (@d4 as varchar(3)))) return @ipstr end /*MSSql code */ |
интересная идея
возьму на вооружение
Отличная идея для перевода
Спасибо, пользуйтесь!