如何在存储过程里面把10进制数字转化为2进制数据,

arrow_gx 2005-07-28 05:30:30
如题,用于进行IP判断,思路如下,把IP4个部分分拆,每个部分分别转换成2进制字符串,然后进行字符串相加,得出一个唯一代表网络地址的2进制地址,然后将这个地址转化为10进制,方便进行比较,有人能提供好的更好思路吗???如何实现,最好附简单代码

分不够,另开贴给分,分数多多啊
...全文
242 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2005-07-29
  • 打赏
  • 举报
回复
直接的数字比较,比字符串比较前效得多.
zjcxc 2005-07-29
  • 打赏
  • 举报
回复
IP地址本来就是一个数字表示的,没必要做那么多转换,只需要在数字与字符之间转换就行了.

楼主可以 ping 123456
就可以发现是ping 0.1.226.64 的ip地址.

转换的规则是:
64*256^0+226*256^1+1*256^2+0*256^3
zjcxc 2005-07-29
  • 打赏
  • 举报
回复
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_IP2Int]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_IP2Int]
GO

/*--字符型 IP 地址转换成数字 IP

--邹建 2004.08(引用请保留此信息)--*/

/*--调用示例

select dbo.f_IP2Int('192.168.0.11')
select dbo.f_IP2Int('12.168.0.1')
--*/
CREATE FUNCTION f_IP2Int(
@ip char(15)
)RETURNS bigint
AS
BEGIN
DECLARE @re bigint
SET @re=0
SELECT @re=@re+LEFT(@ip,CHARINDEX('.',@ip+'.')-1)*ID
,@ip=STUFF(@ip,1,CHARINDEX('.',@ip+'.'),'')
FROM(
SELECT ID=CAST(16777216 as bigint)
UNION ALL SELECT 65536
UNION ALL SELECT 256
UNION ALL SELECT 1)A
RETURN(@re)
END
GO



if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_Int2IP]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_Int2IP]
GO

/*--数字 IP 转换成格式化 IP 地址

--邹建 2004.08(引用请保留此信息)--*/

/*--调用示例

select dbo.f_Int2IP(3232235531)
select dbo.f_Int2IP(212336641)
--*/
CREATE FUNCTION f_Int2IP(
@IP bigint
)RETURNS varchar(15)
AS
BEGIN
DECLARE @re varchar(15)
SET @re=''
SELECT @re=@re+'.'+CAST(@IP/ID as varchar)
,@IP=@IP%ID
from(
SELECT ID=CAST(16777216 as bigint)
UNION ALL SELECT 65536
UNION ALL SELECT 256
UNION ALL SELECT 1)a
RETURN(STUFF(@re,1,1,''))
END
vivianfdlpw 2005-07-29
  • 打赏
  • 举报
回复
将字符串IP地址转换为二进位数值
http://www.microsoft.com/china/sql/using/tips/development/ipbinary.asp
arrow_gx 2005-07-29
  • 打赏
  • 举报
回复
大家的好建议我试试,在这里先感谢 邹建 小黑 子陌红尘
happydreamer 2005-07-28
  • 打赏
  • 举报
回复
--我的方法,把ip地址处理为12位字符串后进行比较,比如192.168.0.1处理为192168000001

CREATE FUNCTION FN_iporder(@a varchar(8000))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @b varchar(8000)
SELECT @b='',@a=@a+'.'
WHILE charindex('.',@a)>0
BEGIN
SET @b=@b+right('000'+substring(@a,1,charindex('.',@a)-1),3)
SET @a=right(@a,len(@a)-charindex('.',@a))
END
RETURN @b
END
go

CREATE TABLE #ip(ip varchar(15) )
go

INSERT INTO #ip SELECT '192.168.0.2' UNION SELECT '192.168.10.1'
UNION SELECT '132.232.39.231' UNION SELECT '132.232.8.11'
go


SELECT * FROM #ip
ORDER BY dbo.getorder(ip) ASC
--
132.232.8.11
132.232.39.231
192.168.0.2
192.168.10.1
子陌红尘 2005-07-28
  • 打赏
  • 举报
回复
--创建将字符串转为二进制数的函数
create function f_Char2Binary(@str varchar(8000))
returns varchar(8000)
AS
BEGIN
DECLARE @r varbinary(8000),@i int,@j int
select @r=cast(@str as varbinary(8000)),@i=datalength(@r),@str=''
while @i>0
begin
select @j=substring(@r,@i,1),
@str=substring('0123456789ABCDEF',@j/16+1,1)
+substring('0123456789ABCDEF',@j%16+1,1)
+@str,
@i=@i-1
end
return(@str)
end
go


--创建将IP地址转为十进制数的函数,
create function sp_getIP(@v varchar(20))
returns numeric(24)
as
begin
declare @v2 varchar(40),@n numeric(24)

select
@v2 = right('3030' + dbo.f_Char2Binary(PARSENAME(@v,4)),6)
+ right('3030' + dbo.f_Char2Binary(PARSENAME(@v,3)),6)
+ right('3030' + dbo.f_Char2Binary(PARSENAME(@v,2)),6)
+ right('3030' + dbo.f_Char2Binary(PARSENAME(@v,1)),6)

select @n = cast(@v2 as numeric(24))

return @n
end


--执行调用
select dbo.sp_getIP('192.168.1.125')

--输出结果
313932313638303031313235
vivianfdlpw 2005-07-28
  • 打赏
  • 举报
回复
然后进行字符串相加
=====================>
什么意思?

然后将这个地址转化为10进制
===============〉
你输入的ip不就是十进制的吗?
子陌红尘 2005-07-28
  • 打赏
  • 举报
回复
不明白楼主要求实现如何的转换,最后得到的二进制地址以及十进制地址数据是怎样的?

For example ...
子陌红尘 2005-07-28
  • 打赏
  • 举报
回复
--自己写用户定义函数
create function f_Char2Binary(@str varchar(8000))
returns varchar(8000)
AS
BEGIN
DECLARE @r varbinary(8000),@i int,@j int
select @r=cast(@str as varbinary(8000)),@i=datalength(@r),@str=''
while @i>0
begin
select @j=substring(@r,@i,1),
@str=substring('0123456789ABCDEF',@j/16+1,1)
+substring('0123456789ABCDEF',@j%16+1,1)
+@str,
@i=@i-1
end
return(@str)
end
go

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧