hexadecimal convertir convert cast sql sql-server integer hex

sql - cast - Convertir entero a hexadecimal y hexadecimal a entero



int to hex java (15)

Así que tengo esta consulta funcionando (donde signal_data es una columna) en Sybase, pero no funciona en Microsoft SQL Server:

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

También lo tengo en Excel (donde A1 contiene el valor):

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

¿Alguien sabe cómo lo haría en SQL Server?


A continuación hay dos funciones: dbo.HexToInt y dbo.IntToHex, las uso para dicha conversión:

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

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


Aquí está la función para el servidor SQL que convierte el valor entero en su representación hexadecimal como varchar. Debería ser fácil de adaptar a otros tipos de bases de datos

Por ejemplo:

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


Convierta int a hex:

SELECT FORMAT(512+255,''X'')


Convierte INT a hexadecimal:

SELECT CONVERT(VARBINARY(8), 16777215)

Convertir hex a INT:

SELECT CONVERT(INT, 0xFFFFFF)

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

Actualización 2015-03-16 (por Oskar Berggren)

El ejemplo anterior tiene la limitación de que solo funciona cuando el valor HEX se da como un literal entero. Para completar, si el valor para convertir es una cadena hexadecimal (como la encontrada en una columna 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: La cadena debe contener un número par de dígitos hexadecimales. Un número impar de dígitos producirá un error.

Se pueden encontrar más detalles en la sección "Estilos binarios" de CAST y CONVERT (Transact-SQL) . Creo que se requiere SQL Server 2008 o posterior.


El hexágono traditonal de 4 bits es bastante directo. Hex String to Integer (suponiendo que el valor se almacena en el campo llamado FHexString):

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

Entero a Hex String (Asumiendo que el valor se almacena en el campo llamado FInteger):

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

Es importante tener en cuenta que cuando comienzas a usar tamaños de bits que provocan el uso compartido de registros, especialmente en una máquina de inteligencia, tus derechos Alto y Bajo e Izquierdo y Derechos en los registros se intercambiarán debido a la naturaleza poco endian de Intel. Por ejemplo, cuando se usa un varbinary (3), estamos hablando de un hexadecimal de 6 caracteres. En este caso, los bits se emparejan como los siguientes índices de derecha a izquierda "54,32,10". En un sistema de inteligencia, esperarías "76,54,32,10". Como solo está utilizando 6 de los 8, debe recordar hacer los intercambios usted mismo. "76,54" calificará como su izquierda y "32,10" calificará como su derecho. La coma separa tu alto y bajo. Intel intercambia los altos y bajos, luego la izquierda y los derechos. Entonces para hacer una conversión ... suspiro, tienes que cambiarlos, por ejemplo, lo siguiente convierte los primeros 6 de un hex 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 ))) ))

Es un poco complicado, así que trataría de mantener mis conversiones en hexadecimales de 8 caracteres (varbinary (4)).

En resumen, esto debería responder a su pregunta. Exhaustivamente.


En realidad, la función incorporada se llama master.dbo.fn_varbintohexstr.

Así por ejemplo:

SELECT 100, master.dbo.fn_varbintohexstr(100)

Te dio

100 0x00000064


Es posible usar la función FORMAT disponible en SQL Server 2012 y superior

select FORMAT(10,''x2'')

Resultados en:

0a


La respuesta de Maksym Kozlenko es agradable y se puede modificar ligeramente para manejar la codificación de un valor numérico a cualquier formato de código. Por ejemplo:

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

Entonces, un gran número como 150 millones, se convierte en solo 6 caracteres (150,000,000 = "MQGJMU")

También podría usar diferentes caracteres en diferentes secuencias como un dispositivo de encriptación. O pase los caracteres de código y la longitud de los caracteres y utilícelos como un método de salazón para encriptar.

Y el reverso:

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


No tiene una forma estándar (es decir, ANSI) de hacer esta conversión.

Todo lo que hagas será una funcionalidad propietaria.

Te sugiero que muevas esta conversión a tu código en lugar de depender de la base de datos.


Para convertir cadenas hexadecimales a INT, lo he usado en el pasado. Se puede modificar para convertir cualquier base a INT de hecho (Octal, Binary, lo que sea)

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


SQL Server equivale a las funciones de DEC2HEX, HEX2DEC basadas en cadenas de 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


Use master.dbo.fnbintohexstr(16777215) para convertir a una representación varchar .


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


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)


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

Me funciona como una expresión en el color de fuente