Перевод IP в число и обратно

Автор: | 24.02.2015

Как известно, при переводе 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 */

Перевод IP в число и обратно: 3 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *