source

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

factcode 2023. 7. 13. 21:11
반응형

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

그래서 저는 이 질문이 작동합니다(어디서).signal_dataSQL 에서 작동하지 않습니다.

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

있습니다.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진수 문자열(예: 막대 열)인 경우 다음을 사용합니다.

-- 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)

너에게 주는 것

1000x00000064

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

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

select FORMAT(10,'x2')

결과:

0a

16진수로 변환:

SELECT FORMAT(512+255,'X')

전통적인 4비트 육각형은 매우 직접적입니다.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
                ))))

특히 인텔 컴퓨터에서 레지스터 공유를 유발하는 비트 크기를 사용하기 시작하면 Intel의 작은 엔디언 특성으로 인해 레지스터의 High, Low, Left 및 Rights가 변경됩니다.예를 들어, varbinary(3)를 사용할 때는 6자 Hex를 사용합니다.이 경우 비트는 오른쪽에서 왼쪽 "54,32,10"까지 다음 인덱스로 쌍을 이룹니다.인텔 시스템에서는 "76,54,32,10"을 예상할 수 있습니다.8개 중 6개만 사용하고 있기 때문에 스왑을 직접 수행하는 것을 기억해야 합니다.왼쪽은 "76,54", 오른쪽은 "32,10"입니다.쉼표는 높은 곳과 낮은 곳을 구분합니다.인텔은 높은 곳과 낮은 곳, 그리고 왼쪽과 오른쪽을 바꿉니다.변환을 수행하려면...예를 들어, 다음은 8자 16진수 중 처음 6개를 변환합니다.

(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진수로 바차로 표현하는 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

사용하다master.dbo.fnbintohexstr(16777215)로 변환varchar표상

Maksym Kozlenko는 멋진 해결책을 가지고 있습니다. 그리고 다른 사람들은 그것의 모든 잠재력을 풀려고 가까이 다가갑니다. 하지만 당신이 어떤 일련의 문자를 정의할 수 있고, 그것의 길이를 베이스로 사용할 수 있다는 것을 깨닫는 것을 완전히 놓칩니다.이것이 제가 그의 솔루션의 약간 수정된 버전을 좋아하는 이유입니다. 왜냐하면 그것은 16번 베이스나 17번 베이스 등에서 작동할 수 있기 때문입니다.

예를 들어, 만약 당신이 문자와 숫자를 원하지만 I는 1로 보이고 O는 0으로 보이는 것을 좋아하지 않는다면 어떨까요?이러한 방식으로 모든 시퀀스를 정의할 수 있습니다.아래는 I와 O를 건너뛰어 "수정된 베이스 34"를 만드는 "베이스 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

값, 기준 크기, 결과

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
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)

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자만 됩니다(1억 5천만 = "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

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

글꼴 색상의 표현으로 나를 위해 일하고 있습니다.

Hex string을 INT로 변환하기 위해 예전에 사용한 적이 있습니다.임의의 기본값을 실제로 INT로 변환하도록 수정할 수 있습니다(Octal, Binary 등).

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

언급URL : https://stackoverflow.com/questions/703019/convert-integer-to-hex-and-hex-to-integer

반응형