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