zoukankan      html  css  js  c++  java
  • 教你怎样写自定义IP地址算法

    通过IP地址可以看到算法规律,写成自定义IP地址,也可以把IP地址转为自定格式的IP地址。也可以用于加密一些明文数字。起始次方可自定义(以1次方和0次方为例)

    a.以下写正反算法(以1次方为最小单位):

    USE tempdb
    GO
    IF OBJECT_ID('fn_NrToChar') IS NOT NULL
     DROP FUNCTION fn_NrToChar
    GO
    /****************************************************************************************************************************************************************
    %%函数名:fn_NrToChar
    
    %%功能:把数字改为字符
    ****************************************************************************************************************************************************************
    %%编写:Roy   2014-12-09
    
    ****************************************************************************************************************************************************************/
    CREATE FUNCTION fn_NrToChar ( 
    	@Nr BIGINT
    	,@NrSystem BIGINT=168				--进制
    	,@Split VARCHAR(2)='**'				--分隔符
    	,@PartCount BIGINT=5				--分段数
    )
    RETURNS VARCHAR(50)
    AS 
    BEGIN
    	DECLARE @S VARCHAR(50)=''
    	WHILE @PartCount>0
    		SELECT @S=@S+CASE WHEN @S>'' THEN @Split ELSE '' END+RTRIM(@Nr/POWER(@NrSystem,@PartCount)),@Nr=@Nr%POWER(@NrSystem,@PartCount),@PartCount=@PartCount-1
    	RETURN @S
    END
    GO
    IF OBJECT_ID('fn_CharToNr') IS NOT NULL
     DROP FUNCTION fn_CharToNr
    GO
    /****************************************************************************************************************************************************************
    %%函数名:fn_CharToNr
    
    %%功能:把字符改为数字
    ****************************************************************************************************************************************************************
    %%编写:Roy   2014-12-09
    
    ****************************************************************************************************************************************************************/
    CREATE FUNCTION fn_CharToNr ( 
    	@Str VARCHAR(50)
    	,@NrSystem BIGINT=168				--进制
    	,@Split VARCHAR(2)='**'				--分隔符
    	,@PartCount BIGINT=5				--分段数
    )
    RETURNS BIGINT
    AS 
    BEGIN
    	DECLARE @Nr BIGINT=0,@StartLen TINYINT,@StrLen TINYINT
    	SELECT @StrLen=LEN(@Split),@StartLen=1
    	WHILE @PartCount>0
    		SELECT @Nr=@Nr+SUBSTRING(@Str,@StartLen,CHARINDEX(@Split,@Str+@Split,@StartLen)-@StartLen)*POWER(@NrSystem,@PartCount),@StartLen=CHARINDEX(@Split,@Str+@Split,@StartLen)+@StrLen,@PartCount=@PartCount-1
    	RETURN @Nr
    END
    GO
    
    --测试1(以IP地址为例)
    
    SELECT dbo.fn_CharToNr('192.168.0.1',256,'.',4)
    SELECT dbo.fn_NrToChar(827452293376,256,'.',4)
    
    /*
    827452293376
    
    192.168.0.1
    */
    go
    --测试2
    DECLARE @i BIGINT=168
    SELECT POWER(@i,5)
    
    --133827821568
    SELECT dbo.fn_CharToNr('167**16**1**6**07',DEFAULT,DEFAULT,DEFAULT)
    SELECT dbo.fn_NrToChar(22361996620824,DEFAULT,DEFAULT,DEFAULT)
    /*
    22361996620824
    
    167**16**1**6**7
    */
    
    

    b.以0次方为最小单位时,是以1为最小数字,如IP为测试例子效果如下:

    USE tempdb
    GO
    IF OBJECT_ID('fn_NrToChar') IS NOT NULL
     DROP FUNCTION fn_NrToChar
    GO
    /****************************************************************************************************************************************************************
    %%函数名:fn_NrToChar
    
    %%功能:把数字改为字符
    ****************************************************************************************************************************************************************
    %%编写:Roy   2014-12-09
    
    ****************************************************************************************************************************************************************/
    CREATE FUNCTION fn_NrToChar ( 
    	@Nr BIGINT
    	,@NrSystem BIGINT=168				--进制
    	,@Split VARCHAR(2)='**'				--分隔符
    	,@PartCount BIGINT=5				--分段数
    )
    RETURNS VARCHAR(50)
    AS 
    BEGIN
    	SET @PartCount=@PartCount-1		--以0次方为最小单位(分段数减1)
    	DECLARE @S VARCHAR(50)=''
    	WHILE @PartCount>=0
    		SELECT @S=@S+CASE WHEN @S>'' THEN @Split ELSE '' END+RTRIM(@Nr/POWER(@NrSystem,@PartCount)),@Nr=@Nr%POWER(@NrSystem,@PartCount),@PartCount=@PartCount-1
    	RETURN @S
    END
    GO
    IF OBJECT_ID('fn_CharToNr') IS NOT NULL
     DROP FUNCTION fn_CharToNr
    GO
    /****************************************************************************************************************************************************************
    %%函数名:fn_CharToNr
    
    %%功能:把字符改为数字
    ****************************************************************************************************************************************************************
    %%编写:Roy   2014-12-09
    
    ****************************************************************************************************************************************************************/
    CREATE FUNCTION fn_CharToNr ( 
    	@Str VARCHAR(50)
    	,@NrSystem BIGINT=168				--进制
    	,@Split VARCHAR(2)='**'				--分隔符
    	,@PartCount BIGINT=5				--分段数
    )
    RETURNS BIGINT
    AS 
    BEGIN
    	DECLARE @Nr BIGINT=0,@StartLen TINYINT,@StrLen TINYINT
     SELECT @PartCount = @PartCount - 1		--以0次方为最小单位(分段数减1)
           ,@StrLen = LEN(@Split)
           ,@StartLen = 1
    	WHILE @PartCount>=0
    		SELECT @Nr=@Nr+SUBSTRING(@Str,@StartLen,CHARINDEX(@Split,@Str+@Split,@StartLen)-@StartLen)*POWER(@NrSystem,@PartCount),@StartLen=CHARINDEX(@Split,@Str+@Split,@StartLen)+@StrLen,@PartCount=@PartCount-1
    	RETURN @Nr
    END
    GO
    
    --测试1(以最小IP地址为例)
    
    SELECT dbo.fn_CharToNr('0.0.0.1',256,'.',4)
    SELECT dbo.fn_NrToChar(1,256,'.',4)
    
    /*
    1
    
    0.0.0.1
    */
    
    --测试2(以最大IP地址为例)
    SELECT dbo.fn_CharToNr('255.255.255.255',256,'.',4)
    SELECT dbo.fn_NrToChar(4294967295,256,'.',4)
    /*
    4294967295
    
    
    255.255.255.255
    
    */
    go
    



  • 相关阅读:
    ArrayList源码解析
    HashSet的实现原理
    Spark Streaming之四:Spark Streaming 与 Kafka 集成分析
    Spark Streaming之三:DStream解析
    Spark Streaming之二:StreamingContext解析
    curl与wget区别
    MongoDB之二(增删查改)
    Thread之九:stop
    mysql实战优化之九:MySQL查询缓存总结
    PBE加密算法
  • 原文地址:https://www.cnblogs.com/Roy_88/p/5463049.html
Copyright © 2011-2022 走看看