라이브러리/시스템

IP 변환 (INT <-> VARCHAR)

눌프 2009. 7. 13. 16:53
IP 관리

IP를 관리할 경우 최선 책에 대해....
뭐 가장 좋은 건 실제 IP형태인 VARCHAR(15)와 INT형 2개를 동시 관리하는 거다...
까지꺼, 사이즈 조금 커지면 어때.. 요즘 디스크도 안비싼데....

1. IP를 VARCHAR에서 INT로 변환

CREATE FUNCTION dbo.ipStringToInt 
@ip CHAR(15) 
RETURNS INT 
AS 
BEGIN 
DECLARE @rv INT, 
@o1 INT, 
@o2 INT, 
@o3 INT, 
@o4 INT, 
@base INT 

SELECT 
@o1 = CONVERT(INT, PARSENAME(@ip, 4)), 
@o2 = CONVERT(INT, PARSENAME(@ip, 3)), 
@o3 = CONVERT(INT, PARSENAME(@ip, 2)), 
@o4 = CONVERT(INT, PARSENAME(@ip, 1)) 

IF (@o1 BETWEEN 0 AND 255) 
AND (@o2 BETWEEN 0 AND 255) 
AND (@o3 BETWEEN 0 AND 255) 
AND (@o4 BETWEEN 0 AND 255) 
BEGIN      
SELECT @base = CASE 
WHEN @o1 < 128 THEN 
(@o1 * 16777216) 
ELSE 
-(256 - @o1) * 16777216 
END 

SET @rv = @base +  
(@o2 * 65536) +  
(@o3 * 256) + 
(@o4) 
END 
ELSE 
SET @rv = -1 
RETURN @rv 
END

2. IP를 INT에서 VARCHAR로 변환

CREATE FUNCTION dbo.ipIntToString 
@ip INT 
RETURNS CHAR(15) 
AS 
BEGIN 
DECLARE @o1 INT, 
@o2 INT, 
@o3 INT, 
@o4 INT 

IF ABS(@ip) > 2147483647 
RETURN '255.255.255.255' 

SET @o1 = @ip / 16777216 

IF @o1 = 0 
SELECT @o1 = 255, @ip = @ip + 16777216 

ELSE IF @o1 < 0 
BEGIN 
IF @ip % 16777216 = 0 
SET @o1 = @o1 + 256 
ELSE 
BEGIN 
SET @o1 = @o1 + 255 
IF @o1 = 128 
SET @ip = @ip + 2147483648 
ELSE 
SET @ip = @ip + (16777216 * (256 - @o1)) 
END 
END 
ELSE 
BEGIN 
SET @ip = @ip - (16777216 * @o1) 
END 

SET @ip = @ip % 16777216 
SET @o2 = @ip / 65536 
SET @ip = @ip % 65536 
SET @o3 = @ip / 256 
SET @ip = @ip % 256 
SET @o4 = @ip 

RETURN 
CONVERT(VARCHAR(4), @o1) + '.' + 
CONVERT(VARCHAR(4), @o2) + '.' + 
CONVERT(VARCHAR(4), @o3) + '.' + 
CONVERT(VARCHAR(4), @o4) 
END