IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Conversion Hexadécimal !


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut Conversion Hexadécimal !
    Hello,

    Je me pose une question (peut-être qu'il existe une réponse simple ), voilà mon cas :
    Je cherche à convertir en hexadécimal une valeur entière (bigint) et j'ai fait plusieurs tests, dont celui-ci qui me laisse perplexe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(bigint, 0xFFFFFFFF)
    => 4294967295 (parfait, logique c'est la valeur maximale sur 4 octets)

    Maintenant si je fais l'inverse pour retrouver ma valeur hexadécimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(varbinary(4), 4294967295)
    => 0x0A000001 alors que je m'attendais à avoir 0xFFFFFFFF

    Du coups j'ai poussé à 8 octets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(varbinary(8), 4294967295)
    => 0x0A000001FFFFFFFF je ne comprends pas !

    Maintenant en castant ma valeur en bigint, j'obtiens le bon résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(varbinary(4), CAST(4294967295 AS bigint))
    => 0xFFFFFFFF


    Du coup la question est : Comment le moteur SQL interprète t il la valeur brute 4294967295 ??

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 001
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(BINARY(4), CAST(4294967295 AS BIGINT))
    L'hexadécimal se lit à l'envers des nombre donc faire attention à l'alignement découlant du format du nombre… => BIGINT !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut
    Citation Envoyé par SQLpro Voir le message

    L'hexadécimal se lit à l'envers des nombre donc faire attention à l'alignement découlant du format du nombre… => BIGINT !
    Ok mais ça ne répond pas à la question ... ou alors je n'ai pas compris

    Si je ne fais pas de CONVERT en BIGINT, la valeur hexa n'est pas la même.
    La valeur 4294967295 devrait tout le temps renvoyer FFFFFFFF sur 4 octets (peut importe l'ordre)
    Si la conversion se fait sur 8 octets : 0x00000000FFFFFFFF, ça restera toujours FFFFFFFF avec les 0 à gauche.

    Hors sans CONVERT, je me retrouve avec 0x0A000001FFFFFFFF
    Pourquoi ?
    Et si je fais l'inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(bigint, 0x0A000001FFFFFFFF)
    => 720575948969213951

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 001
    Billets dans le blog
    6
    Par défaut
    As tu essayé le code que je t'ai donné ?

    Ta question était :
    Je cherche à convertir en hexadécimal une valeur entière (bigint)
    la réponse que je t'ai apportée est la bonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(BINARY(4), CAST(4294967295 AS BIGINT))
    La conversion inverse étant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CAST(0xFFFFFFFF AS bigint)
    Comme je te l'ai dit, IL FAUT TRAVAILLER LES CONVERSIONS DE TYPE ENTIER VERS HEXADECIMAL EN BIGINT en non en INT. Rien n'empêche un INT de recevoir uin BIGINT s'il est inférieur au max du INT.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 87
    Par défaut
    Oui j'ai compris qu'il fallait obligatoirement forcer en BigInt pour une conversion Hexa.
    Du coup la question que je me pose, c'est en quoi il converti ma valeur "4294967295" sans CAST ni CONVERT ?
    Comment SQL l'interprète t il ?

Discussions similaires

  1. [TP] Conversion hexadécimal à binaire
    Par sos dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 17/02/2008, 18h24
  2. conversion hexadécimal binaire
    Par naazih dans le forum Langage
    Réponses: 5
    Dernier message: 21/11/2007, 11h48
  3. Conversion Hexadécimal en Décimal
    Par fveysseire dans le forum C
    Réponses: 2
    Dernier message: 31/08/2006, 11h03
  4. Conversion hexadécimal en ascii
    Par andrianiaina dans le forum C
    Réponses: 12
    Dernier message: 08/08/2006, 07h21
  5. Conversion hexadécimal -> décimal
    Par botanica dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/10/2005, 09h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo