정수를 16 진수로, 16 진수를 정수로 변환


78

그래서 signal_dataSybase 에서이 쿼리 ( 열이있는 곳) 가 작동 하지만 Microsoft SQL Server에서는 작동하지 않습니다.

HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal

Excel에도 있습니다 ( A1값 이 포함 된 위치 ).

=HEX2DEC(LEFT(DEC2HEX(A1),LEN(DEC2HEX(A1))-2))

누구든지 SQL Server에서이 작업을 수행하는 방법을 알고 있습니까?

답변:


119

INT를 16 진수로 변환 :

SELECT CONVERT(VARBINARY(8), 16777215)

16 진수를 INT로 변환 :

SELECT CONVERT(INT, 0xFFFFFF)

업데이트 2015-03-16

위의 예에는 HEX 값이 정수 리터럴로 제공되는 경우에만 작동한다는 제한이 있습니다. 완전성을 위해 변환 할 값이 16 진수 문자열 (예 : varchar 열에 있음) 인 경우 다음을 사용합니다.

-- If the '0x' marker is present:
SELECT CONVERT(INT, CONVERT(VARBINARY, '0x1FFFFF', 1))

-- If the '0x' marker is NOT present:
SELECT CONVERT(INT, CONVERT(VARBINARY, '1FFFFF', 2))

참고 : 문자열에는 짝수의 16 진수가 포함되어야합니다. 홀수 자릿수는 오류를 생성합니다.

자세한 내용은 CAST 및 CONVERT (Transact-SQL) 의 "바이너리 스타일"섹션에서 확인할 수 있습니다 . SQL Server 2008 이상이 필요하다고 생각합니다.


8
VARBINARY로 변환하면 16 진수 값으로 데이터가 제공됩니다. 문자열 연산을 수행 할 수 없습니다
Pavan

1
@Bill Karwin, Pavan이 맞습니다. SQL Server 2008은 convert함수 를 통해이를 수행 할 수 있지만 2005 이하에서는 불가능합니다.

2
ARGB와 같이 8 자 16 진수를 사용하는 경우 INT 대신 BIGINT로 변환합니다. INT의 최대 값은 2,147,483,647 또는 7FFFFFFF입니다. INT를 사용할 때는 16 진수로의 왕복이 작동하지만 결과는 Excel의 Hex2Dec과 다릅니다.
DenverJT

SELECT CONVERT(INT, CONVERT(varbinary, '01', 2))반환 12337 (SQL Server 2005)
Ian Boyd

첫 번째 예는 16 진수로 변환되지 않습니다. 이진수로 변환됩니다. (바이너리 값은 임의의 숫자베이스와 독립적으로 존재합니다. 숫자베이스는 문자열 표현의 컨텍스트에서만 의미가 있습니다.) (또한 매개 변수가 리터럴 일 필요는 없습니다 (정수 여야 함).) 바이너리를 문자열로 변환 (예 : 표시) 할 때 기본적으로 16 진수로 표시하기 때문에 16 진수로 변환하는 것처럼 보일 수 있습니다. (이것은 KipBryan의 대답 @과 같이 16 진수로 변환하는 데 사용하지만, DenNukem과의 WndProc의 대답은 간단 수 있습니다.)
존 B. LAMBE

46

실제로 내장 함수의 이름은 master.dbo.fn_varbintohexstr입니다.

예를 들면 다음과 같습니다.

SELECT 100, master.dbo.fn_varbintohexstr(100)

당신에게 준다

100 0x00000064


3
단점에 대해서는 dba.stackexchange.com/questions/46910/… 을 참조하십시오 .
Vadzim

@Vadzim 대부분의 '단점'-문서 / 사양의 부족을 제외하고-BS!처럼 들립니다.
user2864740

28

SQL Server는 Excel의 문자열 기반 DEC2HEX, HEX2DEC 함수에 해당합니다.

--Convert INT to hex string:
PRINT CONVERT(VARCHAR(8),CONVERT(VARBINARY(4), 16777215),2) --DEC2HEX

--Convert hex string to INT:
PRINT CONVERT(INT,CONVERT(VARBINARY(4),'00FFFFFF',2)) --HEX2DEC


13

SQL Server 2012 이상에서 사용 가능한 FORMAT 함수를 사용할 수 있습니다.

select FORMAT(10,'x2')

결과 :

0a

5

traditonal 4 비트 16 진수는 매우 직접적입니다. 16 진수 문자열을 정수로 (값이 FHexString이라는 필드에 저장되어 있다고 가정) :

CONVERT(BIGINT,CONVERT(varbinary(4),
                (SELECT master.dbo.fn_cdc_hexstrtobin(

                    LEFT(FMEID_ESN,8)                       
                ))
                ))

Integer to Hex String (값이 FInteger라는 필드에 저장되어 있다고 가정) :

(SELECT master.dbo.fn_varbintohexstr(CONVERT(varbinary,CONVERT(int,
                    FInteger
                ))))

특히 인텔 시스템에서 레지스터 공유를 유발하는 비트 크기를 사용하기 시작하면 인텔의 리틀 엔디안 특성으로 인해 레지스터의 높음 및 낮음, 왼쪽 및 권한이 서로 바뀝니다. 예를 들어 varbinary (3)를 사용할 때 6 자 16 진수에 대해 이야기하고 있습니다. 이 경우 비트는 오른쪽에서 왼쪽 "54,32,10"으로 다음 인덱스로 쌍을 이룹니다. 인텔 시스템에서는 "76,54,32,10"이 예상됩니다. 8 개 중 6 개만 사용하므로 스왑을 직접 수행해야합니다. "76,54"는 귀하의 왼쪽으로, "32,10"은 귀하의 오른쪽으로 간주됩니다. 쉼표는 고점과 저점을 구분합니다. 인텔은 최고와 최저를 바꾼 다음 왼쪽과 권리를 바꿉니다. 그래서 변환을하려면 ... 한숨, 예를 들어 스스로 바꿔야합니다.

(SELECT master.dbo.fn_replvarbintoint(
                CONVERT(varbinary(3),(SELECT master.dbo.fn_cdc_hexstrtobin(
                    --intel processors, registers are switched, so reverse them 


                    ----second half
                    RIGHT(FHex8,2)+ --0,1 (0 indexed)
                    LEFT(RIGHT(FHex8,4),2)+ -- 2,3 (oindex)
                    --first half
                    LEFT(RIGHT(FHex8,6),2) --4,5

                )))
                ))

조금 복잡해서 8 자 16 진수 (varbinary (4))로 변환을 유지하려고합니다.

요약하면 이것은 귀하의 질문에 대한 답변입니다. 종합적으로.


5

다음은 정수 값을 16 진수 표현으로 varchar로 변환하는 SQL 서버용 함수입니다. 다른 데이터베이스 유형에 쉽게 적응할 수 있어야합니다.

예를 들면 :

SELECT dbo.ToHex(4095) --> FFF

SQL :

CREATE FUNCTION ToHex(@value int)
RETURNS varchar(50)
AS
BEGIN
    DECLARE @seq char(16)
    DECLARE @result varchar(50)
    DECLARE @digit char(1)
    SET @seq = '0123456789ABCDEF'

    SET @result = SUBSTRING(@seq, (@value%16)+1, 1)

    WHILE @value > 0
    BEGIN
        SET @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1)

        SET @value = @value/16
        IF @value <> 0 SET @result = @digit + @result
    END 

    RETURN @result
END
GO

작동 중입니다! 완전한! "IF @ value 0"을 "IF @ value <> 0"으로
바꾸면됩니다

이 솔루션은 훨씬 더 강력한 솔루션으로 쉽게 수정할 수 있기 때문에 좋아합니다. 시퀀스 길이를 기본으로 사용하는 예제 솔루션을 제공했습니다.
Greg

3

표현 master.dbo.fnbintohexstr(16777215)으로 변환하는 데 사용 합니다 varchar.


1
select master.sys.fn_varbintohexstr(1)2008 년
ekkis

2
Declare @Dato xml
Set @Dato = Convert(xml, '<dato>FF</dato>')
Select Cast( rw.value( 'xs:hexBinary( text()[1])' , 'varbinary(max)' ) as int ) From @Dato.nodes('dato') as T(rw)

2

Maksym Kozlenko의 답변은 훌륭하며 숫자 값을 모든 코드 형식으로 인코딩하도록 약간 수정할 수 있습니다. 예를 들면 :

CREATE FUNCTION [dbo].[IntToAlpha](@Value int)
RETURNS varchar(30)
AS
BEGIN
    DECLARE @CodeChars varchar(100) 
    SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    DECLARE @CodeLength int = 26
    DECLARE @Result varchar(30) = ''
    DECLARE @Digit char(1)

    SET @Result = SUBSTRING(@CodeChars, (@Value % @CodeLength) + 1, 1)
    WHILE @Value > 0
    BEGIN
        SET @Digit = SUBSTRING(@CodeChars, ((@Value / @CodeLength) % @CodeLength) + 1, 1)
        SET @Value = @Value / @CodeLength
        IF @Value <> 0 SET @Result = @Digit + @Result
    END 

    RETURN @Result
END

따라서 1 억 5 천만과 같은 큰 숫자는 6 자 (150,000,000 = "MQGJMU")가됩니다.

암호화 장치로 다른 시퀀스의 다른 문자를 사용할 수도 있습니다. 또는 코드 문자와 문자 길이를 전달하고 암호화를위한 솔팅 방법으로 사용합니다.

그리고 그 반대 :

CREATE FUNCTION [dbo].[AlphaToInt](@Value varchar(7))
RETURNS int
AS
BEGIN
    DECLARE @CodeChars varchar(100) 
    SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    DECLARE @CodeLength int = 26
    DECLARE @Digit char(1)
    DECLARE @Result int = 0
    DECLARE @DigitValue int
    DECLARE @Index int = 0
    DECLARE @Reverse varchar(7)
    SET @Reverse = REVERSE(@Value)

    WHILE @Index < LEN(@Value)
    BEGIN
        SET @Digit = SUBSTRING(@Reverse, @Index + 1, 1)
        SET @DigitValue = (CHARINDEX(@Digit, @CodeChars) - 1) * POWER(@CodeLength, @Index)
        SET @Result = @Result + @DigitValue
        SET @Index = @Index + 1
    END 
    RETURN @Result

2

Maksym Kozlenko는 멋진 솔루션을 가지고 있으며, 다른 사람들이 가까이 와서 그것의 잠재력을 잠금 해제 하지만 다음 문자의 순서를 정의 할 수 있음을 깨달았다 완전히 그리워 사용 그것의 베이스로 길이를 . 이것이 내가 그의 솔루션의 약간 수정 된 버전을 좋아하는 이유입니다. 16 진법 또는 17 진법 등에서 작동 할 수 있기 때문입니다.

예를 들어, 문자와 숫자를 원하지만 I는 1처럼 보이고 O는 0처럼 보이기를 원하지 않는다면 어떨까요? 이 방법으로 모든 시퀀스를 정의 할 수 있습니다. 아래는 "수정 된베이스 34"를 만들기 위해 I와 O를 건너 뛰는 "베이스 36"의 한 형태입니다. 16 진수로 실행하려면 대신 16 진수 줄의 주석 처리를 제거하십시오.

declare @value int = 1234567890

DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result varchar(50)
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue int = @value

SET @result = SUBSTRING(@seq, (@workingValue%@baseSize)+1, 1)

WHILE @workingValue > 0
BEGIN
    SET @digit = SUBSTRING(@seq, ((@workingValue/@baseSize)%@baseSize)+1, 1)

    SET @workingValue = @workingValue/@baseSize
    IF @workingValue <> 0 SET @result = @digit + @result
END 

select @value as Value, @baseSize as BaseSize, @result as Result

값, BaseSize, 결과

1234567890, 34, T5URAA

나는 또한 가치를 실무 가치로 옮긴 다음 개인적 선호도에 따라 실무 가치 사본에서 일했습니다.

아래는 시퀀스의 길이로 정의 된 염기를 사용하여 모든 시퀀스에 대해 변환 반전을 위한 추가입니다 .

declare @value varchar(50) = 'T5URAA'

DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result int = 0
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue varchar(50) = @value

DECLARE @PositionMultiplier int = 1
DECLARE @digitPositionInSequence int = 0

WHILE len(@workingValue) > 0
BEGIN
    SET @digit = right(@workingValue,1)
    SET @digitPositionInSequence = CHARINDEX(@digit,@seq)
    SET @result = @result + ( (@digitPositionInSequence -1) * @PositionMultiplier)

    --select @digit, @digitPositionInSequence, @PositionMultiplier, @result

    SET @workingValue = left(@workingValue,len(@workingValue)-1)
    SET @PositionMultiplier = @PositionMultiplier * @baseSize
END 

select @value as Value, @baseSize as BaseSize, @result as Result

1

주어진:

declare @hexStr varchar(16), @intVal int

IntToHexStr :

select @hexStr = convert(varbinary, @intVal, 1)

HexStrToInt :

declare
    @query varchar(100),
    @parameters varchar(50)

select
    @query = 'select @result = convert(int,' + @hb + ')',
    @parameters = '@result int output'

exec master.dbo.Sp_executesql @query, @parameters, @intVal output

0
IIF(Fields!HIGHLIGHT_COLOUR.Value="","#FFFFFF","#" & hex(Fields!HIGHLIGHT_COLOUR.Value) & StrDup(6-LEN(hex(Fields!HIGHLIGHT_COLOUR.Value)),"0"))

나를 위해 글꼴 색상 표현으로 일하고 있습니까?


0

Hex 문자열을 INT로 변환하기 위해 과거에 이것을 사용했습니다. 실제로 모든 기본을 INT로 변환하도록 수정할 수 있습니다 (8 진수, 2 진수 등).

Declare @Str varchar(200)
Set @str = 'F000BE1A'

Declare @ndx int
Set @ndx = Len(@str)
Declare @RunningTotal  BigInt
Set @RunningTotal = 0

While @ndx > 0
Begin
    Declare @Exponent BigInt
    Set @Exponent = Len(@Str) - @ndx

    Set @RunningTotal = @RunningTotal + 

    Power(16 * 1.0, @Exponent) *
    Case Substring(@str, @ndx, 1)
        When '0' then 0
        When '1' then 1
        When '2' then 2 
        When '3' then 3
        When '4' then 4
        When '5' then 5
        When '6' then 6
        When '7' then 7
        When '8' then 8
        When '9' then 9
        When 'A' then 10
        When 'B' then 11
        When 'C' then 12
        When 'D' then 13
        When 'E' then 14
        When 'F' then 15
    End
    Set @ndx = @ndx - 1
End

Print @RunningTotal

0

다음은 dbo.HexToInt 및 dbo.IntToHex의 두 가지 함수입니다. 이러한 변환에 사용합니다.

if OBJECT_ID('dbo.HexToInt') is not null
    drop function dbo.HexToInt
GO
create function dbo.HexToInt (@chars varchar(max))
returns int
begin
    declare @char varchar(1), @len int, @i int, @r int, @tmp int, @pow int
    set @chars = RTRIM(LTRIM(@chars))
    set @len = LEN(@chars)
    set @i = 1
    set @r = 0
    while @i <= @len
    begin
        set @pow = @len - @i
        set @char = SUBSTRING(@chars, @i, 1)
        if @char = '0'
            set @tmp = 0
        else if @char = '1'
            set @tmp = 1
        else if @char = '2'
            set @tmp = 2
        else if @char = '3'
            set @tmp = 3
        else if @char = '4'
            set @tmp = 4
        else if @char = '5'
            set @tmp = 5
        else if @char = '6'
            set @tmp = 6
        else if @char = '7'
            set @tmp = 7
        else if @char = '8'
            set @tmp = 8
        else if @char = '9'
            set @tmp = 9
        else if @char = 'A'
            set @tmp = 10
        else if @char = 'B'
            set @tmp = 11
        else if @char = 'C'
            set @tmp = 12
        else if @char = 'D'
            set @tmp = 13
        else if @char = 'E'
            set @tmp = 14
        else if @char = 'F'
            set @tmp = 15
        set @r = @r + @tmp * POWER(16,@pow)
        set @i = @i + 1     
    end
    return @r
end

그리고 두 번째 :

if OBJECT_ID('dbo.IntToHex') is not null
    drop function dbo.IntToHex
GO
create function dbo.IntToHex (@val int)
returns varchar(max)
begin
    declare @r varchar(max), @tmp int, @v1 int, @v2 int, @char varchar(1)
    set @tmp = @val
    set @r = ''
    while 1=1
    begin
        set @v1 = @tmp / 16
        set @v2 = @tmp % 16
        if @v2 = 0
            set @char = '0'
        else if @v2 = 1
            set @char = '1'
        else if @v2 = 2
            set @char = '2'
        else if @v2 = 3
            set @char = '3'
        else if @v2 = 4
            set @char = '4'
        else if @v2 = 5
            set @char = '5'
        else if @v2 = 6
            set @char = '6'
        else if @v2 = 7
            set @char = '7'
        else if @v2 = 8
            set @char = '8'
        else if @v2 = 9
            set @char = '9'
        else if @v2 = 10
            set @char = 'A'
        else if @v2 = 11
            set @char = 'B'
        else if @v2 = 12
            set @char = 'C'
        else if @v2 = 13
            set @char = 'D'
        else if @v2 = 14
            set @char = 'E'
        else if @v2 = 15
            set @char = 'F'
        set @tmp = @v1 
        set @r = @char + @r
        if @tmp = 0
            break
    end
    return @r
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.