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

Как известно, при переводе IP-адреса в число, мы экономим ресурсы памяти, так как IP-адрес в четвертой версии — это 32-х битовое число и запись вида 192.168.1.1 будет занимать 15 байт, а в числовом виде всего 4 байта. Удобной формой записи (IPv4) является запись в виде четырёх десятичных чисел значением от 0 до 255, разделённых точками, например, 192.0.2.60. Но для хранения его в базе данных лучше перевести его в десятичное целое число. Например 192.168.1.1 — это одно и то же, что 3232235777.

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 */

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

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