Как известно, при переводе IP-адреса в число, мы экономим ресурсы памяти, так как IP-адрес в четвертой версии — это 32-х битовое число и запись вида 192.168.1.1 будет занимать 15 байт, а в числовом виде всего 4 байта. Удобной формой записи (IPv4) является запись в виде четырёх десятичных чисел значением от 0 до 255, разделённых точками, например, 192.0.2.60. Но для хранения его в базе данных лучше перевести его в десятичное целое число. Например 192.168.1.1 — это одно и то же, что 3232235777.
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];
}
В PHP есть встроенная функция перевода из IP в число — ip2long, но по умолчанию она переводит в отрицательные числа.
Ввиду того, что PHP тип integer является знаковым, и на 32-битных системах большое количество IP адресов будет представлено в виде отрицательных чисел, необходимо использовать «%u» в функции sprintf() или printf() для получения IP адреса в строковом беззнаковом виде.
Теперь рассмотрим функцию перевода из числа обратно в IP-адрес, на примере MSSQL.
/*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 */
интересная идея
возьму на вооружение
Отличная идея для перевода
Спасибо, пользуйтесь!