快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

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

对于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地址,可以完全删掉对它们进行处理的代码。
返回类别: 教程
上一教程: SQL Server中读取XML文件的简朴做法
下一教程: 根据进程号获取该进程所在客户端的ip地址

您可以阅读与"如何将作为字符串保存的IP地址变为二进制数值?"相关的教程:
· 如何确定对方的IP地址
· MYSQL中如何存取二进制文件
· MYSQL如何存取二进制文件
· 如何将ACCESS和EXCEL导入到MYSQL中之三
· SQL中自己创建函数,分割字符串
    微笑服务 优质保证 索取样品