• 教你怎样写自定义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
    



  • 相关阅读:
    SpringBoot(一)_快速实战搭建项目
    maven入门 (二)_私服安装与上传下载
    maven入门(一)
    Ionic 2 开发(一)_安装与目录结构
    echarts添加点击事件
    win下 git gui 使用教程
    安装centos6.3
    PAT甲级题分类汇编——图
    PAT甲级题分类汇编——树
    PAT甲级题分类汇编——理论
  • 原文地址:https://www.cnblogs.com/Roy_88/p/5463049.html
Copyright © 2020-2023  润新知