SQL/MS-SQL & SQL Server Management Studio

[MSSQL] 10 => 16 진수 변환 / 16 => 10진수 변환

삐뚤어진 개발자 2020. 2. 11.

MSSQL에서 10진수를 16진수로 변환, 또는 16진수를 10진수로 변환하는 함수를 제공하지 않는 것 같다.

 

그래서 함수를 직접 만들어서 사용한다.

 

일단, 10진수를 16진수로 변환하는 함수다.

 

1. 10진수 => 16진수 변환 함수

CREATE function fn_dectohex(@dec bigint)
returns nvarchar(50) as
begin
if @dec =0 
begin return '0'; end

 declare @hex nvarchar(50)
 select @hex = '';

 while (@dec > 0)
 begin
  declare @h nvarchar(1)
  declare @n int

  select @n = @dec % 16

  if(@n = 10)begin select @h = 'a' end
  else if(@n = 11)begin select @h = 'b' end
  else if(@n = 12)begin select @h = 'c' end
  else if(@n = 13)begin select @h = 'd' end
  else if(@n = 14)begin select @h = 'e' end
  else if(@n = 15)begin select @h = 'f' end
  else begin select @h = convert(nvarchar(1), @n) end
  select @hex = @h + @hex
  select @dec = @dec/16
 end

 return @hex
end

 

간단히 설명하자면,

10진수를 파라미터로 받아서

16으로 나눠준 다음 몫을 계속 붙여준다.

(파라미터가 0이 될때 까지 반복.) 

 

10진수 10을 16진수에서는 a

10진수 11을 16진수에서는 b

10진수 12을 16진수에서는 c

10진수 13을 16진수에서는 d

10진수 14을 16진수에서는 e

10진수 15을 16진수에서는 f 

으로 표기하기 때문에 if else로 분기처리를 해준다.

 

아래와 같이 사용할 수 있다.

SELECT dbo.fn_dectohex(15)
-- 결과 : f

 

2. 반대로 16진수 => 10진수로 변경하는 방법은

 

간단하다.

DECLARE @HEX_INDEX AS varchar(16)
SET @HEX_INDEX = '0123456789abcdef'

SELECT CHARINDEX('b',@HEX_INDEX)-1
-- 결과 : 11 (16진수 b는 10진수로 11)

@HEX_INDEX를 '0123456789abcdef' 로 지정해 놓고,

CHARINDEX 함수를 사용해 16진수의 INDEX를 구하는 것이다.

 

16진수 한글자 밖에 되지 않으니, 복수의 16진수는 함수를 만들어 사용해야한다.(원리는 같다.)

 

 

 

 

MSSQL 10 16 진수 변환 함수 

댓글