如何将作为字符串保存的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地址,可以完全删掉对它们进行处理的代码。
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地址,可以完全删掉对它们进行处理的代码。
相关文章推荐
- 将作为字符串保存的IP地址变为二进制数值
- MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换
- kshell 如何比较两个数值或字符串 "test" [[ ]]" "(())" "[ ]"
- C++模板类函数的使用以及如何使用时间作为文件名保存文件
- 如何将数据库连接字符串保存在配置文件中并读取
- cout如何输出数值的二进制格式?(转载)
- 字符串中如何提取数值
- 如何转换字符串为数值- -
- 如何把数据流转换为二进制字符串
- 如何:在十六进制字符串与数值类型之间转换(C# 编程指南)
- 字符串IP地址转换成IP数值函数
- Swift如何将数值转换为可拼写的字符串
- C语言-----内存与指针(3) How 4000 do you pass a string to a function如何给一个函数传入字符串作为参数:
- 字符串处理函数:识别一字符串所属的数值常量类型(十六进制、二进制、十进制整数,浮点数)
- 在shell中如何判断字符串是否为有效的IP地址
- 如何将数据库连接字符串保存在配置文件中并读取
- cout如何输出数值的二进制格式?(小例子)
- 当POST请求是 既包含图片二进制 又包含字符串参数 如何用原生请求(二)
- C语言中字符串如何转换为二进制、八进制、十进制、十六进制
- php中如何把一个数字字符串作为一个变量