代码改变世界

[转载]IP to Integer

  AnyKoro  阅读(399)  评论(0编辑  收藏  举报

有时候我们要判断某个IP是否在某个段内,如何实现呢? 一个简单办法就是把IP转换成Integer,然后判断整数是否在某个范围内就可以实现这个判断。

转换的算法如下:

比如我们要转换的IP为: 058.062.042.000

First Octet: 058
Second Octet: 062
Third Octet: 042
Fourth Octet: 000

计算公式如下:
(first octet * 256³) + (second octet * 256²) + (third octet * 256) + (fourth octet)
=  (first octet * 16777216) + (second octet * 65536) + (third octet * 256) + (fourth octet)
=  (058 * 16777216) + (062 * 65536) + (042 * 256) + (000)
=  977152512

网上有现成的服务,比如下面这个地址:

http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp

SQL Server 的一个例子如下:

CREATE
FUNCTION
dbo.ipStringToInt

(

@ip CHAR
(15)

)

RETURNS
INT


AS


BEGIN


DECLARE
@rv INT
,

@o1 INT
,

@o2 INT
,

@o3 INT
,

@o4 INT
,

@base INT




SELECT


@o1 = CONVERT
(INT
, PARSENAME(@ip, 4)),

@o2 = CONVERT
(INT
, PARSENAME(@ip, 3)),

@o3 = CONVERT
(INT
, PARSENAME(@ip, 2)),

@o4 = CONVERT
(INT
, PARSENAME(@ip, 1))



IF
(@o1 BETWEEN
0 AND
255)

AND
(@o2 BETWEEN
0 AND
255)

AND
(@o3 BETWEEN
0 AND
255)

AND
(@o4 BETWEEN
0 AND
255)

BEGIN


SELECT
@base = CASE


WHEN
@o1 < 128 THEN


(@o1 * 16777216)

ELSE


-(256 - @o1) * 16777216

END




SET
@rv = @base +

(@o2 * 65536) +

(@o3 * 256) +

(@o4)

END


ELSE


SET
@rv = -1

RETURN
@rv

END


go

调用范例:

select
dbo.ipStringToInt('058.062.042.000
')

整数转换如下:

CREATE
FUNCTION
dbo.ipIntToString

(

@ip INT


)

RETURNS
CHAR
(15)

AS


BEGIN


DECLARE
@o1 INT
,

@o2 INT
,

@o3 INT
,

@o4 INT




IF
ABS(@ip) > 2147483647

RETURN
'255.255.255.255
'



SET
@o1 = @ip / 16777216



IF
@o1 = 0

SELECT
@o1 = 255, @ip = @ip + 16777216



ELSE
IF
@o1 < 0

BEGIN


IF
@ip % 16777216 = 0

SET
@o1 = @o1 + 256

ELSE


BEGIN


SET
@o1 = @o1 + 255

IF
@o1 = 128

SET
@ip = @ip + 2147483648

ELSE


SET
@ip = @ip + (16777216 * (256 - @o1))

END


END


ELSE


BEGIN


SET
@ip = @ip - (16777216 * @o1)

END




SET
@ip = @ip % 16777216

SET
@o2 = @ip / 65536

SET
@ip = @ip % 65536

SET
@o3 = @ip / 256

SET
@ip = @ip % 256

SET
@o4 = @ip



RETURN


CONVERT
(VARCHAR
(4), @o1) + '.
' +

CONVERT
(VARCHAR
(4), @o2) + '.
' +

CONVERT
(VARCHAR
(4), @o3) + '.
' +

CONVERT
(VARCHAR
(4), @o4)

END


go

调用范例:

select
dbo.ipIntToString(977152512)

C# 的例子如下:

using
System;

using
System.Net;



namespace
ConsoleApplication1

{

class
Program

{

static
long
ToInt(string
addr)

{

return
BitConverter.ToInt32(IPAddress.Parse(addr).GetAddressBytes(), 0);

}



static
string
ToAddr(long
address)

{

return
IPAddress.Parse(address.ToString()).ToString();

// This also works:


// return new IPAddress((uint) IPAddress.HostToNetworkOrder(


// (int) address)).ToString();


}



static
void
Main(string
[] args)

{

Console.WriteLine(ToInt("64.233.187.99
"));

Console.WriteLine(ToAddr(1089059683));



Console.ReadLine();

}

}

}

参考资料:

How should I store an IP address in SQL Server?
http://sqlserver2000.databases.aspfaq.com/how-should-i-store-an-ip-address-in-sql-server.html

How to convert an IPv4 address into a integer in C#?
http://stackoverflow.com/questions/461742/how-to-convert-an-ipv4-address-into-a-integer-in-c

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示