IT TIP

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

itqueen 2020. 10. 22. 23:50
반응형

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


그래서 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에서이 작업을 수행하는 방법을 알고 있습니까?


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 이상이 필요하다고 생각합니다.


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

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

SELECT 100, master.dbo.fn_varbintohexstr(100)

당신에게 준다

100 0x00000064


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

int를 16 진수로 변환 :

SELECT FORMAT(512+255,'X')


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

select FORMAT(10,'x2')

결과 :

0a

traditonal 4 비트 16 진수는 매우 직접적입니다. Hex String to Integer (값이 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))로 변환을 유지하려고합니다.

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


다음은 정수 값을 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

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)

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


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

주어진:

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

IIF(Fields!HIGHLIGHT_COLOUR.Value="","#FFFFFF","#" & hex(Fields!HIGHLIGHT_COLOUR.Value) & StrDup(6-LEN(hex(Fields!HIGHLIGHT_COLOUR.Value)),"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

다음은 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

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

For example, what if you wanted letters and numbers, but don't like I's for looking like 1's and O's for looking like 0's. You can define any sequence this way. Below is a form of a "Base 36" that skips the I and O to create a "modified base 34". Un-comment the hex line instead to run as hex.

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

Value, BaseSize, Result

1234567890, 34, T5URAA

I also moved value over to a working value, and then work from the working value copy, as a personal preference.

Below is additional for reversing the transformation, for any sequence, with the base defined as the length of the sequence.

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

참고URL : https://stackoverflow.com/questions/703019/convert-integer-to-hex-and-hex-to-integer

반응형