IP to Integer
9776 ワード
ある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の例は次のとおりです.
呼び出し例:
整数は次のように変換されます.
呼び出し例:
C#の例は次のとおりです.
参考資料:
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
変換アルゴリズムは次のとおりです.
例えば、私たちが変換する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 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 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