80 votes

Convertir un entier en hex et hex en un entier

J'ai donc cette requête qui fonctionne (où signal_data est une colonne) dans Sybase mais qui ne fonctionne pas dans Microsoft SQL Server:

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

Je l'ai aussi dans Excel (où A1 contient la valeur):

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

Est-ce que quelqu'un sait comment je le ferais dans SQL Server?

133voto

Bill Karwin Points 204877

Convertir INT en hex:

 SELECT CONVERT(VARBINARY(8), 16777215)
 

Convertir l'hex en INT:

 SELECT CONVERT(INT, 0xFFFFFF)
 

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

50voto

justinpitts Points 377

En fait, la fonction intégrée s'appelle master.dbo.fn_varbintohexstr.

Donc, par exemple:

 SELECT 100, master.dbo.fn_varbintohexstr(100)
 

Vous donne

100 0x00000064

32voto

Kip Bryan Points 53

SQL Server équivalent aux fonctions DEC2HEX, HEX2DEC basées sur des chaînes d'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
 

6voto

Neel Edwards Points 188

La traditionnelle 4 bits hex est assez direct. Chaîne hexadécimale en Entier (en Supposant que la valeur est stockée dans le champ appelé FHexString) :

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

                    LEFT(FMEID_ESN,8)                       
                ))
                ))

Entier en Chaîne Hexadécimale (en Supposant que la valeur est stockée dans le champ appelé FInteger):

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

Important à noter est que lorsque vous commencez à utiliser bits tailles registre des causes de partage, en particulier sur un ordinateur intel Haut et Bas et de Gauche et de Droits dans les registres vont être remplacées en raison de la little endian nature de Intel. Par exemple, lors de l'utilisation d'un varbinary(3), nous parlons d'un 6 caractères Hex. Dans ce cas, votre bits sont couplées par les indices suivants de la droite vers la gauche "54,32,10". Dans un système intel, vous devez vous attendre "76,54,32,10". Puisque vous êtes seulement à l'aide de 6, de 8, vous devez vous rappeler de faire les swaps de vous-même. "76,54" seront admissibles à votre gauche et "32,10" seront admissibles à votre droite. La virgule sépare de votre haute et basse. Intel swaps de haut et de bas, puis la gauche et droits. Donc pour faire une conversion...soupir, vous avez obtenu à l'échange de vous-mêmes pour l'exemple, l'exemple suivant convertit les 6 premiers de 8 caractères hex:

(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

                )))
                ))

C'est un peu compliqué, donc je voudrais essayer de garder mes conversions à 8 caractères hex de l' (varbinary(4)).

En résumé, cela devrait répondre à votre question. De manière globale.

5voto

Maksym Kozlenko Points 4557

Voici la fonction pour SQL server qui convertit la valeur entière dans sa représentation hexadécimale comme un varchar. Il devrait être facile de s'adapter à d'autres types de base de données

Par exemple:

SELECT dbo.ToHex(4095) --> FFF
CRÉER la FONCTION ToHex(@valeur de type int)
RETOURNE varchar(50)
COMME
COMMENCER
 DECLARE @seq char(16)
 DECLARE @résultat de type varchar(50)
 DECLARE @chiffres char(1)
 SET @seq = '0123456789ABCDEF'

 SET @result = SUBSTRING(@seq (@valeur%16)+1, 1)

 ALORS que @valeur > 0
COMMENCER
 SET @chiffres = SUBSTRING(@seq ((@valeur/16)%16)+1, 1)

 SET @value = @valeur/16
 SI @valeur 0 @result = @chiffres + @result
 FIN 

 De RETOUR @result
FIN
ALLER

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X