[转载]IP to Integer
2010-02-09 08:55 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)