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

VBA Access Discussion :

conversion mot de 4 octets hexadecimal en decimal


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 264
    Par défaut conversion mot de 4 octets hexadecimal en decimal
    Bonjour à tous,
    je dois apres extraction des données dans un fichier binaire convertir des mots de 4 octets en décimal.
    Pour ce faire j ai crée une structure qur voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    Public ils As trame_ILS
     
    Public Type Word_ILS
        bPoidsFaibles As Byte
        bPoidsForts As Byte
        bPoidsFaibles1 As Byte
        bPoidsForts1 As Byte
     
    End Type
     
    Public Type trame_ILS
     
        type_ILS As Word_ILS
        num_ILS As Word_ILS
     
    End Type
    Jusque là tout va bien puisque j'arrive à rescupérer mes 4 octets que je viens ensuite stocker dans un buffer de la manière suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    With ils
     
     
     
            ils.num_ILS.bPoidsFaibles = buffer1(10)
            ils.num_ILS.bPoidsForts = buffer1(11)
            ils.num_ILS.bPoidsFaibles1 = buffer1(12)
            ils.num_ILS.bPoidsForts1 = buffer1(13)     
     
      ' ensuite je decode mon mot de 4 octets hexadecimal en decimal   
     
     
                 type1 = ((ils.num_ILS.bPoidsForts1 * 256 * 256 * 256) + ils.num_ILS.bPoidsFaibles1 * 256 * 256) + ((ils.num_ILS.bPoidsForts * 256) + ils.num_ILS.bPoidsFaibles) 
     
     
     
       MsgBox type1
     
     
     
     
      End With
    QUand je le décodage a la main je tombe bien sur la valeur désiré qui par exemple 885057083. J ai déclaré type1 en tant que long ( 32 bits). Et pourtant j ai un message d erreur " dépassement capacité".
    Pourtant la valeur décimale est toujours positive donc je devrais declarer un unsigned mais j ai pas trouvé sous vb .
    Je pense que c'est un probleme au niveau de la variable type1 mais je ne vois pas comment la déclarer autrement.
    SI vous aveez des idées.
    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Par défaut
    Bonjour,
    il y a une lourde contrainte sous VBA, les non-signés n'existent pas.
    Pour la conversion de 4 octets en Dword tu peux aussi plus simplement passé par l'écriture hexadécimal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Type1=Clng("&h" & format(buffer1(13),"00") & format(buffer1(12),"00") & format(buffer1(11),"00") & format(buffer1(10),"00"))

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 264
    Par défaut conversion mot de 4 octets hexadecimal en decimal
    Merci pour ton interet.
    PAr contre je ne comprend pas tout sur la syntaxe que tu as mis en ligne.
    Qu entend tu par Dword.
    Moi j ai gardé type1 en long et j ai juste remplacé ma ligne par celle que tu m as envoyé mais j ai toujours dépassement de capacité.

    En gros pour que ca convertit correctement dois je juste remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     type1 = ((ils.num_ILS.bPoidsForts1 * 256 * 256 * 256) + ils.num_ILS.bPoidsFaibles1 * 256 * 256) + ((ils.num_ILS.bPoidsForts * 256) + ils.num_ILS.bPoidsFaibles)
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Type1=Clng("&h" & format(buffer1(13),"00") & format(buffer1(12),"00") & format(buffer1(11),"00") & format(buffer1(10),"00"))
    Merci encore

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Par défaut
    Oui, pardon DWORD c'est pareil que Long sous VB.

    j'ai fait une erreur dans ma conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Type1=Clng("&h" & format(Hex(buffer1(13)),"00") & format(Hex(Buffer1(12)),"00") & Format(Hex(Buffer1(11)),"00") & Format(Hex(Buffer1(10)),"00"))

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 264
    Par défaut conversion mot de 4 octets hexadecimal en decimal
    Salut et merci encore.Ca marche presque.
    En effet ca marche bien pour quasi toute les valeurs sauf qu a un moment mon fichier contient les 4 octets suivant : 63 138 242 55 donc j ai mes buffers suivants :
    buffer1(13) = 55 poids fort
    buffer1(12) = 242
    buffer1(11) = 138
    buffer1(10) = 63 poids faibles

    A la main je trouve la bonne valeur à savoir 938641983.
    PAr contre quand j utilise ton code j ai la valeur suivante 938606655 et là j avouerai que je bloque.
    J ai même fait une fonction a part pour ne tester que ta ligne de code pour voir si ce n était pas un probleme de taille de fichier ou autre et là pareil.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    Private Sub test_click()
     
    Dim num_enr As Long
    Dim buffer1(20) As Byte
     
     
     
        buffer1(13) = 55
        buffer1(12) = 242
        buffer1(11) = 138
        buffer1(10) = 63
     
     
     
          num_enr = CLng("&h" & Format(Hex(buffer1(13)), "00") & Format(Hex(buffer1(12)), "00") & Format(Hex(buffer1(11)), "00") & Format(Hex(buffer1(10)), "00"))
     
     
          MsgBox buffer1(13)
          MsgBox buffer1(12)
          MsgBox buffer1(11)
          MsgBox buffer1(10)     
     
          MsgBox num_enr
     
     
     
    End Sub
    Pourtant si c est à cause du type de num_enr, c'est bizarre puisque ton code fonctionne prfois avec de nombre supérieur à 938641983.
    Si vousa vez une idée je suis preneur.
    Merci encore

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Par défaut
    Effectivement, le 138 n'est pas correctement converti en 8A mais en 00.

    bon pour le moment la seule solution de remplacement est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type1=Clng(Replace("&h" & Format(hex(buffer1(13)),"@@") & Format(Hex(buffer1(12)),"@@") & Format(Hex(Buffer1(11)),"@@") & Format(Hex(Buffer1(10)),"@@")," ","0"))

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    bonjour,

    une alternative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Function testmot()
       Dim buffer(1 To 4) As Byte
       buffer(1) = 63
       buffer(2) = 138
       buffer(3) = 242
       buffer(4) = 55
       MsgBox buffer(1) + buffer(2) * 256& + buffer(3) * 256 ^ 2 + buffer(4) * 256 ^ 3
    End Function
    le & est important pour forcer le type en long.

    Philippe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transformer un hexadecimal en decimal
    Par funtim78 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/08/2009, 23h02
  2. Sélectionner un octet dans un mot de 2 octets
    Par Jerepain dans le forum C
    Réponses: 5
    Dernier message: 28/05/2009, 13h19
  3. Convertir un hexadecimal en decimal
    Par yann87 dans le forum Débuter
    Réponses: 6
    Dernier message: 24/09/2008, 12h40
  4. Conversion nombre flottant en octet
    Par Fred677 dans le forum C
    Réponses: 6
    Dernier message: 04/07/2007, 20h24
  5. convertion valeur hexadecimal en decimal
    Par devdev2003 dans le forum C
    Réponses: 8
    Dernier message: 06/10/2005, 12h35

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