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

来源:互联网 发布:伴游网站 源码 编辑:程序博客网 时间:2024/06/05 19:28
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
对于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地址,可以完全删掉对它们进行处理的代码。

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>