Converte inteiro para hexadecimal e hexadecimal para inteiro

Então, eu tenho essa consulta funcionando (onde signal_data é uma coluna) no Sybase, mas não funciona no Microsoft SQL Server:

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

Eu também tenho no Excel (onde A1 contém o valor):

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

Alguém sabe como eu faria isso no SQL Server?

Converter INT para hexadecimal:

 SELECT CONVERT(VARBINARY(8), 16777215) 

Converter hex para INT:

 SELECT CONVERT(INT, 0xFFFFFF) 

Veja http://classicasp.aspfaq.com/general/how-do-i-convert-from-hex-to-int-and-back.html

Atualização 2015-03-16 (por Oskar Berggren)

O exemplo acima tem a limitação de que ele só funciona quando o valor HEX é dado como um literal inteiro. Para ser completo, se o valor a ser convertido for uma cadeia hexadecimal (como encontrado em uma coluna varchar), use:

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

Nota: A cadeia deve conter um número par de dígitos hexadecimais. Um número ímpar de dígitos produzirá um erro.

Mais detalhes podem ser encontrados na seção “Estilos binários” de CAST e CONVERT (Transact-SQL) . Eu acredito que o SQL Server 2008 ou posterior seja necessário.

Na verdade, a function interna é denominada master.dbo.fn_varbintohexstr.

Então, por exemplo:

 SELECT 100, master.dbo.fn_varbintohexstr(100) 

Da-te

100 0x00000064

Equivalentes do SQL Server às funções DEC2HEX, HEX2DEC baseadas em string do Excel:

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

Converter int para hexadecimal:

SELECT FORMAT(512+255,'X')

Aqui está a function para o servidor SQL que converte o valor inteiro em sua representação hexadecimal como um varchar. Deve ser fácil adaptar-se a outros tipos de database

Por exemplo:

 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 

O tradicional hexadecimal de 4 bits é bastante direto. Hex String to Integer (Assumindo que o valor é armazenado no campo chamado FHexString):

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

Inteiro a Hex String (Assumindo que o valor é armazenado no campo chamado FInteger):

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

É importante notar que quando você começa a usar tamanhos de bit que causam o compartilhamento de registradores, especialmente em uma máquina Intel, seu Alto e Baixo e Left e Rights nos registradores serão trocados devido à natureza little endian da Intel. Por exemplo, ao usar um varbinary (3), estamos falando de um Hex de 6 caracteres. Nesse caso, seus bits são pareados como os seguintes índices da direita para a esquerda “54,32,10”. Em um sistema de intel, você esperaria “76,54,32,10”. Desde que você está usando apenas 6 dos 8, você precisa se lembrar de fazer as trocas você mesmo. “76,54” qualificará como sua esquerda e “32,10” qualificará como seu direito. A vírgula separa seu alto e baixo. A Intel troca as altas e baixas, depois a esquerda e os direitos. Então, para fazer uma conversão … suspiro, você tem que trocá-los por exemplo, o seguinte converte os primeiros 6 de um hexadecimal de 8 caracteres:

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

É um pouco complicado, então eu tentaria manter minhas conversões em hexadecimal de 8 caracteres (varbinary (4)).

Em resumo, isso deve responder à sua pergunta. Abrangente.

É possível usar a function FORMAT disponível no SQL Server 2012 e acima

 select FORMAT(10,'x2') 

Resulta em:

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

A resposta de Maksym Kozlenko é legal e pode ser levemente modificada para lidar com a codificação de um valor numérico para qualquer formato de código. Por exemplo:

 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 

Então, um grande número como 150 milhões, se torna apenas 6 caracteres (150.000.000 = “MQGJMU”)

Você também pode usar caracteres diferentes em seqüências diferentes como um dispositivo de criptografia. Ou passe os caracteres de código e o comprimento dos caracteres e use como método de salga para criptografar.

E o contrário:

 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 

Dado:

 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 

Use master.dbo.fnbintohexstr(16777215) para converter em uma representação varchar .

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

Está trabalhando para mim como uma expressão na cor da fonte

Para converter strings Hex para INT, usei isso no passado. Ele pode ser modificado para converter qualquer base em INT (Octal, Binary, whatever)

 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 

Abaixo estão duas funções: dbo.HexToInt e dbo.IntToHex, eu as uso para essa conversão:

 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 

E o segundo:

 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 

Você não tem uma maneira padrão (ou seja, ANSI) de fazer essa conversão.

Tudo o que você fizer será uma funcionalidade proprietária.

Eu sugiro mover essa conversão para o seu código, em vez de depender do database.