您的位置:首页 > 其它

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

2008-04-28 06:41 288 查看
对于2000,你可以使用下列函数:

CREATEFUNCTIONdbo.IPAddrStr2Bin(@strIPvarchar(15),@Validatebit=1)
RETURNSbinary(4)
AS
BEGIN
IF@Validate=1
BEGIN
--onlydigitsanddots
IF@strIPLIKE'%[^.0-9]%'RETURN(NULL)
--numberofdotsmustbe3
IFLEN(@strIP)-LEN(REPLACE(@strIP,'.',''))!=3RETURN(NULL)
--alloctetsmustbespecified
IF@strIPNOTLIKE'%_%.%_%.%_%.%_%'RETURN(NULL)
END
DECLARE@oct1binary(1),
@oct2binary(1),
@oct3binary(1),
@oct4binary(1)
SET@oct1=CAST(CAST(LEFT(@strIP,CHARINDEX('.',@strIP)-1)ASint)AS
binary(1))
SET@oct2=CAST(CAST(SUBSTRING(@strIP,CHARINDEX('.',@strIP)+1,
CHARINDEX('.',@strIP,CHARINDEX('.',@strIP)+1)-CHARINDEX('.',@strIP)
-1)ASint)ASbinary(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)ASint)ASbinary(1))
SET@oct4=CAST(CAST(RIGHT(@strIP,LEN(@strIP)-(LEN(@strIP)-
CHARINDEX('.',REVERSE(@strIP))+1))ASint)ASbinary(1))
IF@Validate=1
BEGIN
IFNOT(
(@oct1BETWEEN0x01AND0xFF)AND
(@oct2BETWEEN0x00AND0xFF)AND
(@oct3BETWEEN0x00AND0xFF)AND
(@oct4BETWEEN0x00AND0xFF)
)RETURN(NULL)
END
RETURN(@oct1+@oct2+@oct3+@oct4)
END
GO

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

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

CREATEPROCEDUREdbo.spIPAddrStr2Bin
@strIPvarchar(15),
@binIPbinary(4)OUTPUT,
@Validatebit=1
AS
IF@Validate=1
BEGIN
--onlydigitsanddots
IF@strIPLIKE'%[^.0-9]%'RETURN(NULL)
--numberofdotsmustbe3
IFLEN(@strIP)-LEN(REPLACE(@strIP,'.',''))!=3RETURN(NULL)
--alloctetsmustbespecified
IF@strIPNOTLIKE'%_%.%_%.%_%.%_%'RETURN(NULL)
END
DECLARE@oct1binary(1),
@oct2binary(1),
@oct3binary(1),
@oct4binary(1)
SET@oct1=CAST(CAST(LEFT(@strIP,CHARINDEX('.',@strIP)-1)ASint)AS
binary(1))
SET@oct2=CAST(CAST(SUBSTRING(@strIP,CHARINDEX('.',@strIP)+1,
CHARINDEX('.',@strIP,CHARINDEX('.',@strIP)+1)-CHARINDEX('.',
@strIP)-1)ASint)ASbinary(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)ASint)ASbinary(1))
SET@oct4=CAST(CAST(RIGHT(@strIP,LEN(@strIP)-(LEN(@strIP)-
CHARINDEX('.',REVERSE(@strIP))+1))ASint)ASbinary(1))
IF@Validate=1
BEGIN
IFNOT(
(@oct1BETWEEN0x01AND0xFF)AND
(@oct2BETWEEN0x00AND0xFF)AND
(@oct3BETWEEN0x00AND0xFF)AND
(@oct4BETWEEN0x00AND0xFF)
)RETURN(NULL)
END
SET@binIP=@oct1+@oct2+@oct3+@oct4
GO

使用例子:

DECLARE@binIPbinary(4)
EXECdbo.spIPAddrStr2Bin'172.29.23.2',@binIPOUTPUT,0
PRINT@binIP

注意:如果你不需要或不想验证自己的字符串IP地址,可以完全删掉对它们进行处理的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: