SQL IP to BigInt IP地址转换数字
来源:互联网 发布:手机照片移花接木软件 编辑:程序博客网 时间:2024/06/10 08:45
http://blog.joycode.com/ghj/tags/287.aspx
前一篇博客 IP to Integer 提供的 SQL 函数是 IP 转换成 Integer 的方法。 Integer 的最大值为: 2147483647(2^31 - 1)。按照 IP 转换成整数的算法,会算出来大于这个值的,所以之前提供的 IP 转换成 Integer 的方法会算出负值。
下面是 IP to BigInt 的转换算法, 这时候运算就不会小于零。
CREATE FUNCTION dbo.ipStringToBigInt ( @ip CHAR(15) ) RETURNS bigint AS BEGIN DECLARE @rv bigint, @o1 bigint, @o2 INT, @o3 INT, @o4 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 SET @rv = (@o1 * 16777216) + (@o2 * 65536) + (@o3 * 256) + (@o4) END ELSE SET @rv = -1 RETURN @rv ENDgo CREATE FUNCTION dbo.ipBigIntToString ( @ip bigint ) RETURNS CHAR(15) AS BEGIN DECLARE @o1 INT, @o2 INT, @o3 INT, @o4 INT IF @ip > 4294967295 RETURN '255.255.255.255' IF @ip <= 0 RETURN '0.0.0.0' SET @o1 = @ip / 16777216 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) ENDgo -- 调用例子select dbo.ipBigIntToString(3708279131)select dbo.ipStringToBigInt('221.7.217.91')
IP to Integer
有时候我们要判断某个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 ENDgo调用范例:
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) ENDgo调用范例:
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.htmlHow 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
- SQL IP to BigInt IP地址转换数字
- SQL IP to BigInt
- IP地址数字相互转换
- IP地址与数字地址相互转换
- SQL Server IP地址格式转换(GUID To String)
- C# IP地址和整数之间的转换,IP地址和数字ip地址的转换
- python:ip地址转换到数字
- ip地址 转换为数字的公式
- ip地址,字符串、数字格式转换
- 怎样将IP地址转换为数字
- 怎样将IP地址转换为数字
- IP地址和数字的转换
- IP address 与 bigint 之间的转换
- MySQL中时间-->数字转换和IP地址-->数字转换
- IP地址转换:数字与字符串之间的转换
- IP到数字转换
- IP地址转换算法
- IP地址的转换
- 用 PHP V5 开发多任务应用程序
- MFC应用程序创建窗口的过程
- 双缓冲的说明
- 理解“统一编址与独立编址、I/O端口与I/O 内存”
- 如何在列表数据中使用打印按钮实现打印预览
- SQL IP to BigInt IP地址转换数字
- AutoCAD双击反应器练习
- WCF RIA 服务 (二十四)-- Silverlight 客户端 5
- SQL Server 中查询非中文,非英文,非数字的特殊列
- protected,internal和protected internal
- An Inline Function is As Fast As a Macro -- Using GCC
- SQL Server空格处理
- IT蚁族:蜗居和逃离
- ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 问题解决