如何将作为字符串保存的IP地址变为二进制数值?

2016-01-29 17:02 28 1 收藏

如何将作为字符串保存的IP地址变为二进制数值?,如何将作为字符串保存的IP地址变为二进制数值?

【 tulaoshi.com - SQLServer 】

对于SQL Server 2000,你可以使用下列函数:

CREATE FUNCTION dbo.IPAddrStr2Bin(@strIP varchar(15), @Validate bit = 1)
RETURNS binary(4)
AS
BEGIN
IF @Validate = 1
BEGIN
-- only digits and dots
IF @strIP LIKE '%[^.0-9]%' RETURN (NULL)
-- number of dots must be 3
IF LEN(@strIP) - LEN(REPLACE(@strIP, '.', '')) != 3 RETURN (NULL)
-- all octets must be specified
IF @strIP NOT LIKE '%_%.%_%.%_%.%_%' RETURN (NULL)
END
DECLARE @oct1 binary(1),
@oct2 binary(1),
@oct3 binary(1),
@oct4 binary(1)
SET @oct1 = CAST(CAST(LEFT(@strIP, CHARINDEX('.', @strIP) - 1) AS int) AS
binary(1))
SET @oct2 = CAST(CAST(SUBSTRING(@strIP, CHARINDEX('.', @strIP) + 1,
CHARINDEX('.', @strIP, CHARINDEX('.', @strIP) + 1) - CHARINDEX('.', @strIP)
- 1) AS int) AS binary(1))
SET @oct3 = CAST(CAST(SUBSTRING(@strIP, CHARINDEX('.', @strIP,
CHARINDEX('.', @strIP) + 1) + 1, (LEN(@strIP) - CHARINDEX('.',
REVERSE(@strIP)) + 1) - (CHARINDEX('.', @strIP, CHARINDEX('.', @strIP) + 1))
- 1) AS int) AS binary(1))
SET @oct4 = CAST(CAST(RIGHT(@strIP, LEN(@strIP) - (LEN(@strIP) -
CHARINDEX('.', REVERSE(@strIP)) + 1)) AS int) AS binary(1))
IF @Validate = 1
BEGIN
IF NOT(
(@oct1 BETWEEN 0x01 AND 0xFF) AND
(@oct2 BETWEEN 0x00 AND 0xFF) AND
(@oct3 BETWEEN 0x00 AND 0xFF) AND
(@oct4 BETWEEN 0x00 AND 0xFF)
) RETURN(NULL)
END
RETURN (@oct1 + @oct2 + @oct3 + @oct4)
END
GO

使用例子:
SELECT dbo.IPAddrStr2Bin('172.29.23.2', 0)

对于 SQL Server较早的版本,你可以抽出代码,然后直接使用,或者创建如下所示的存储过程:

CREATE PROCEDURE dbo.spIPAddrStr2Bin
@strIP varchar(15),
@binIP binary(4) OUTPUT,
@Validate bit = 1
AS
IF @Validate = 1
BEGIN
-- only digits and dots
IF @strIP LIKE '%[^.0-9]%' RETURN (NULL)
-- number of dots must be 3
IF LEN(@strIP) - LEN(REPLACE(@strIP, '.', '')) != 3 RETURN (NULL)
-- all octets must be specified
IF @strIP NOT LIKE '%_%.%_%.%_%.%_%' RETURN (NULL)
END
DECLARE @oct1 binary(1),
@oct2 binary(1),
@oct3 binary(1),
@oct4 binary(1)
SET @oct1 = CAST(CAST(LEFT(@strIP, CHARINDEX('.', @strIP) - 1) AS int) AS
binary(1))
SET @oct2 = CAST(CAST(SUBSTRING(@strIP, CHARINDEX('.', @strIP) + 1,
CHARINDEX('.', @strIP, CHARINDEX('.', @strIP) + 1) - CHARINDEX('.',
@strIP) - 1) AS int) AS binary(1))
SET @oct3 = CAST(CAST(SUBSTRING(@strIP, CHARINDEX('.', @strIP,
CHARINDEX('.', @strIP) + 1) + 1, (LEN(@strIP) - CHARINDEX('.',
REVERSE(@strIP)) + 1) - (CHARINDEX('.', @strIP, CHARINDEX('.', @strIP) +
1)) - 1) AS int) AS binary(1))
SET @oct4 = CAST(CAST(RIGHT(@strIP, LEN(@strIP) - (LEN(@strIP) -
CHARINDEX('.', REVERSE(@strIP)) + 1)) AS int) AS binary(1))
IF @Validate = 1
BEGIN
IF NOT(
(@oct1 BETWEEN 0x01 AND 0xFF) AND
(@oct2 BETWEEN 0x00 AND 0xFF) AND
(@oct3 BETWEEN 0x00 AND 0xFF) AND
(@oct4 BETWEEN 0x00 AND 0xFF)
) RETURN(NULL)
END
SET @binIP = @oct1 + @oct2 + @oct3 + @oct4
GO

使用例子:

DECLARE @binIP binary(4)
EXEC dbo.spIPAddrStr2Bin '172.29.23.2', @binIP OUTPUT, 0
PRINT @binIP

注意: 如果你不需要或不想验证自己的字符串IP地址,可以完全删掉对它们进行处理的代码。

来源:http://www.tulaoshi.com/n/20160129/1500165.html

延伸阅读
标签: PHP
如何存取二进制文件,用以下代码说明   首先创建测试表testtable CREATE TABLE testtable ( id INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,filename CHAR(255),data LONGBLOB ); 将文件存入表中 <?php mysql_connect( "localhost", "root", "password"); //连接数据库 mysql_sele...
游戏地域《二进制领域》解说视频   解说视频一: 《二进制领域》关于进游戏黑边的解决办法 不是游戏版本问题,也不是你电脑问题 是你进游戏没调整的问题 看图吧: 《二进制领域》图文流程攻略 游戏开始教程跟着小胖对话,把语音系统关掉,Q,E,F,空格,是360的4个键.大致自己按一下. .. 过了教程后一路跟小胖走,会遇到第一波敌人.&...
《二进制领域》视频流程攻略 游戏简介 《二进制领域》由开发了《如龙》系列的知名制作人名越稔洋打造,是一款追求在线对战乐趣的射击游戏。故事发生在2080年的东京,人类为了生存而与背叛的机器人展开厮杀。《二进制领域》将登陆PS3与XBOX360平台,游戏预定2012年2月发售。 本作中,玩家们将和多名同伴一起行动,采用互相协力来进行战斗的Tea...
《二进制领域》游戏评测 游戏简介   《二进制领域》由开发了《如龙》系列的知名制作人名越稔洋打造,是一款追求在线对战乐趣的射击游戏。故事发生在2080年的东京,人类为了生存而与背叛的机器人展开厮杀。本作中,玩家们将和多名同伴一起行动,采用互相协力来进行战斗的Team Action,是一款以团队行动为主题的动作射击游戏。玩家们必须根...
《二进制领域》游戏的配置要求   电脑型号          X86 兼容 台式电脑   操作系统          Windows XP 专业版 32位 SP3 ( DirectX 9.0c )   处理器            AMD Semp...

经验教程

74

收藏

94
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部