none
Conversion binaire en single RRS feed

  • Question

  • Bonjour a tous,

    Je me decide enfin a demander de l'aide !

     je developpe une application qui sous VB 2010 express et je rencontre quelques difficultés.

    1) Je dois enregistrer des données venant de mon port serie toutes les x minutes. Quellemethode pour les enregistrer, au fil de l'eau, dans un fichier CSV ?

    2) Ces données arrivent par paquet de 4 bytes en valeurs hexa, le premier byte est l'adresse du module, les 2 suivants la valeur  du module, et le dernier le cheksum. C'est sur la valeur que je coince, en effet ces 2 bytes donne un nombre a virgule flottante, avec 1 bit de flag,4 bits d'exposant et 11  bits de mantisses (Norme IEEE754 ,demi virgule flotante, non signé).

    Par avance, Merci.

    N'hesitez pas si besoin plus d'infos ...! 

     

    jeudi 6 janvier 2011 04:06

Réponses

  • Bonjour,

    Tu demande "quelle méthode ", mais pour faire quoi ? Comment écrire dans un fichier texte ? Comment enregistrer régulièrement quelque chose (le timer) ? Les deux mon capitaine ? Chat manque de précision ...

    Je ne comprends pas ce que tu veux dans l'absolu, car ce nombre en hexa, en le passant en binaire tu as ensuite la possibilité de le recomposer en décimal selon la convention (signe, exposant, mantisse) = (1 ou 0) = 1 bit, de ((8*2)-1) = 4 bits et de ((1024*2)-1) = 11 bits, donc que veux-tu faire à ce "word" hexédécimal, ou alors tu peux directement l'enregistrer comme il arrive sur deux octets, que veux-tu en faire ensuite (calcul ou stockage, ou les deux) ?

     



    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Marqué comme réponse Sinki42 jeudi 6 janvier 2011 13:40
    jeudi 6 janvier 2011 10:58
  • Va voir sur le forum vb6

    http://social.msdn.microsoft.com/Forums/fr-FR/vb6fr/threads

    J'ai posé la question et une personne compétente a répondu (Jean-Marc Noury) ...

    Pou tes données, tu m'as dit 1 4 3 :  8 je sui parti dessus, si chat change ....

    @+, cordialement.



    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe vendredi 7 janvier 2011 18:30
    • Marqué comme réponse Sinki42 vendredi 7 janvier 2011 22:37
    vendredi 7 janvier 2011 18:30

Toutes les réponses

  • Bonjour,

    Tu demande "quelle méthode ", mais pour faire quoi ? Comment écrire dans un fichier texte ? Comment enregistrer régulièrement quelque chose (le timer) ? Les deux mon capitaine ? Chat manque de précision ...

    Je ne comprends pas ce que tu veux dans l'absolu, car ce nombre en hexa, en le passant en binaire tu as ensuite la possibilité de le recomposer en décimal selon la convention (signe, exposant, mantisse) = (1 ou 0) = 1 bit, de ((8*2)-1) = 4 bits et de ((1024*2)-1) = 11 bits, donc que veux-tu faire à ce "word" hexédécimal, ou alors tu peux directement l'enregistrer comme il arrive sur deux octets, que veux-tu en faire ensuite (calcul ou stockage, ou les deux) ?

     



    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Marqué comme réponse Sinki42 jeudi 6 janvier 2011 13:40
    jeudi 6 janvier 2011 10:58
  • Bonjour Ehjoe,

     

    Merci pour ta reactivité ! Je lis regulierement tes reponses sur ce forum, elle sont souvent claires et fournis, je suis content que tu es pris le temps de me repondre.

    En fait, ma difficulté est d'afficher, dans un label, une valeur recu sur 2 octets serparés.

    Exemple : 

                   - Trame recu : 0x01 0x55 0x0A 0x6A

                                                                                        flag   exposant           mantisse

                   - Les 2 octets qui m'interesse sont : 0x55 0xA0 ( 0      1010          101    10100000)

                   - Je devrais afficher dans mon label : 13,625

     

    Il faut donc "reunir" ces 2 bytes dans un single. (J'ai essayé avec + et &, mais cela m'affiche une addition decimal, dans mon exemple :85+160=245)

    Je dois egalement "enregistré" cette valeur, qui change de facon cyclique.

    Une derniere difficulté : j'ai 20 valeurs comme celle-ci a afficher et a enregistrer.

    J'espere t'avoir un peu eclairé sur ma demande.

    Salutations,

    Sinki.

     

    jeudi 6 janvier 2011 14:29
  • re bonjour,

    Déjà je ne maîtrise pas bien les manipulation binaire de virgules flottantes, alors c'est sous réserve :o)

    En prenant ton exemple :

    0101010110100000 b

     0 b      1010 b         101 b   10100000 b

    On a 1(signe), 4(exposant), 11(mantisse) dont 3(virgule) et 8(valeur) b

    Déjà l'octet de poids faible s'identifie directement, A0 h = 160 d par la fonction :

    Dim i As Integer = Convert.ToInt32("a0", 16)
    ' on remplace a0 h par
    dim octet as string = "a0"
    Dim i As Integer = Convert.ToInt32(octet, 16)
    
    ' je pense que ça devrait passer comme ça ?
    
    Pour la virgule, tu la place à 3, pourtant il me semble que c'est 5 d (4 + 0 + 1) ?
    

    Pour l'exposant je trouve 10 d  (8 + 0 + 2 + 0)

    Mais le reste ça ne va pas, si l'octet de poids faible peut être utilisé directement car les bits ont la même signification, l'octet de poids fort a le demi-octet de poids fort qui a 2 significations, et le demi-octet de poids faible a une signification différente de celui de poids fort, donc il faut utiliser les bits selon leur signification, on ne peux pas utiliser directement l'octet de poids fort, car il contient 3 expressions différentes ...

    Je ne crois pas que ce soit une addition, l'exposant est une multiplication il me semble, soit ici la base puissance 10 ou  la base x 10 ou la base + 10 zéros, je ne sais pas ?

    En effet, si c'était une addition, ici, il n'y aurait pas besoin d'écrire

    01010101 10100000 b

    Car en écrivant ceci tu aurais directement ta valeur :

    00000101 10111001 b ... ah ?

    Pour l'éclatement de ton octet h en octet b il y a cette fonction, celui de poids fort :

    dim r as string
    dim octet as string
    octet = tonOctet
    r = Convert.ToString(CLng(octet), 10)
    ' et r va s'éclater en binaire, à parti de là tu peux faire une lecture avec la fonction de chaînes, soit :
    dim signe as string
    dim exposant as string
    dim virgule as string
    signe=mid(r,1,1)
    exposant = mid(r,2,4)
    virgule = mid(r, 6,3)
    ' faire après ou en même temps la conversion en numérique ...
    ' ainsi tu as tout pour faire l'opération
    
    

    Il existe des fonctions de manipulation des bits, souvent par décalage, mais je ne connais pas ces fonctions de tête, faut rechercher "fonction de manipulation des bits", sinon mon exemple est donne le même résultat pour ce qu'on veut en faire ...

    Il faudrait poser la question sur "la manipulation des virgules flottante en binaire", peut être que tu vas tomber sur quelqu'un qui a l'habitude de manipuler ça, voire qu'il existe une fonction ?

    Le & sur deux chaine les lie x="a" : y = "b" : c = x & y = "ab", mais le + fera pareil, donc pour les chaîne mieux vaut utiliser & c'est plus clair, par contre si tes valeurs sont numériques, évidemment on va utiliser +

    Tu écris ... "enregistrer, cycle, 20 valeurs"... mais je ne sais pas ce que tu sais faire ??? comment répondre, tu veux que je te montre comment faire et enregistrer un fichier, ou tu sais ? Tu veux savoir comment faire un cycle ou tu sais ? Pour les labels, 1 ou 20 c'est la même chose, il n'y a rien de difficile, à la rigueur on peux les indexer, est-ce aussi ça que tu veux savoir ?

    Au plaisir :o)

     



    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire

    • Modifié EhJoe jeudi 6 janvier 2011 16:31 Précision
    • Proposé comme réponse EhJoe jeudi 6 janvier 2011 16:34
    jeudi 6 janvier 2011 16:23
  • Tiens, j'ai trouvé des inos sur la manipulation des bits

    http://msdn.microsoft.com/fr-fr/library/2h9cz2eb(v=VS.80).aspx

    http://msdn.microsoft.com/fr-fr/library/7haw1dex(v=VS.80).aspx

    Dim pattern As Short = 192 ' The bit pattern is 0000 0000 1100 0000.
      Dim result1, result2, result3, result4, result5 As Short
    
      result1 = pattern << 0
      r = Convert.ToString(CLng(result1), 2)
      TextBox1.Text = TextBox1.Text & result1 & " : " & r & s
    
      result2 = pattern << 4
      r = Convert.ToString(CLng(result2), 2)
      TextBox1.Text = TextBox1.Text & result2 & " : " & r & s
    
      result3 = pattern << 9
      r = Convert.ToString(CLng(result3), 2)
      TextBox1.Text = TextBox1.Text & result3 & " : " & r & s
    
      result4 = pattern << 17
      r = Convert.ToString(CLng(result4), 2)
      TextBox1.Text = TextBox1.Text & result4 & " : " & r & s
    
      result5 = pattern << -1
      r = Convert.ToString(CLng(result5), 2)
      TextBox1.Text = TextBox1.Text & result5 & " : " & r & s
    
    'résultat
    
    192 : 11000000
    3072 : 110000000000
    -32768 : 1111111111111111111111111111111111111111111111111000000000000000
    384 : 110000000
    0 : 0
    


    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    jeudi 6 janvier 2011 16:53
  • Bonjour,

    J'ai décortiqué au maximum de ce que j'en connais, voici :

    Dim valeurC As String
      valeurC = "55A0" ' h = 2 octets : 55 h = 85 d
      Dim octet1H, octet2H As String
      octet1H = Mid(valeurC, 1, 2)
      octet2H = Mid(valeurC, 3, 2)
      Dim octet1D, mantisse As Integer
      octet1D = Convert.ToInt32(octet1H, 16) ' H(string) en D
      mantisse = Convert.ToInt32(octet2H, 16)
      Dim octet1B As String
      octet1B = Convert.ToString(CLng(octet1D), 2) ' D(string) en B : 01010101 = 85 d
      Do While Len(octet1B) < 8 ' format à 8 bits (0 devant)
       octet1B = "0" & octet1B
      Loop
      Dim signe As Byte
      signe = CByte(Mid(octet1B, 1, 1))
      If signe < 0 Then mantisse = mantisse * -1
      Dim exposantB As String
      exposantB = Mid(octet1B, 2, 4)
      Dim virguleB As String
      virguleB = Mid(octet1B, 6, 3)
      Dim exposant As Integer
      exposant = Convert.ToInt32(exposantB, 2)
      Dim virgule As Integer
      virgule = Convert.ToInt32(virguleB, 2)
      Dim formule As String
      formule = mantisse & "E+" & exposant & " (virgule = " & virgule & ")"
      '
      TextBox1.Text = "valeur = " & valeurC & " h" & vbCrLf
      TextBox1.Text = TextBox1.Text & "octet1H = " & octet1H & " h (valeur)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "octet1D = " & octet1D & " d (octet1H)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "octet1B = " & octet1B & " b (octet1D)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "octet2H = " & octet2H & " h (valeur)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "mantisse = " & mantisse & " d (octet2H)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "signe = " & signe & " d (octet1B)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "exposantB = " & exposantB & " b (octet1B)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "exposant = " & exposant & " d (exposantB)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "virguleB = " & virguleB & " b (octet1B)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "virgule = " & virgule & " d (virguleB)" & vbCrLf
      TextBox1.Text = TextBox1.Text & "formule = " & formule & vbCrLf
      '
      ' Je ne sais comment calculer ça ?
      ' Si c'est mantisse(160) ^ exposant (virgule 5) = 10995,11628
      ' Si c'est le nombre de 0 (160E+10) à rajouter (virgule 5), ça donne = 16000
      ' ???
    

    Ce qui donne à l'affichage du textbox1 (multilines) police "CouRier New", 12

    valeur = 55A0 h
    octet1H = 55 h (valeur)
    octet1D = 85 d (octet1H)
    octet1B = 01010101 b (octet1D)
    octet2H = A0 h (valeur)
    mantisse = 160 d (octet2H)
    signe = 0 d (octet1B)
    exposantB = 1010 b (octet1B)
    exposant = 10 d (exposantB)
    virguleB = 101 b (octet1B)
    virgule = 5 d (virguleB)
    formule = 160E+10 (virgule = 5)
    


    Pose la question en VB6 si tu n'a pas de réponse "Problème d'opération sur les bits", ici :

    http://social.msdn.microsoft.com/Forums/fr-FR/vb6fr/threads

     

     



    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe vendredi 7 janvier 2011 11:44
    vendredi 7 janvier 2011 11:43
  •  BONJOUR HeJoe,

    Je  tombe avec bonne surpise sur ta reponse, cette apres-midi. J'ai passé la nuit a essayé de debuger la solution que tu m'a envoyer hier, en vaint !

    Je viens d'essayer les nouvelles lignes de codes ci dessus, je modifier quelques lignes, notament le formule finale. Mais je bloque sur la mise forme de la mantisse.

    L'ecriture d'un nombre flottant selon la norme IEEE754, demi precision(16bits) est comme ceux-ci : 1bit de signe, 5 bits d'exposant, 10 bits de mantisse.

      dans ce cas la formule= signe * 2^exposant-15 * 1.mantisse

    Ce qui n'est pas tous a fait mon cas, puisque j'ai 4 bits d'exposant et 11 bits de mantisse.

    le resultat qui s'en decoule est :  formule= signe * 2^exposant-7 * 1.mantisse

    la mantisse est comprise entre 0 et <1, et elle est calculée comme ceux-ci : ( 2^-1+2^-2+2^-3+2^-4.......2^-11) = (0.5+0.25+0.125+0.0625......+0,00048828125)

    Dans mon exemple :

    Byte 1 = 55h = 01010101

    Byte 2 =A0h = 10100000

    Signe= 0 = positif =1

    Exposant = 1010 = 10

    Mantisse = 10110100000= 0.5 + 0 + 0.125 + 0.0625 + 0 + 0.015625 =0.703125

     

                        Valeur = 1 * 2 ^ 10-7 * 1.703125 =  13.625

        

    Il faudrais donc tester,un par un, les bits de la mantisse, et lorsque il sont a 1,les  additionner selon  la methode ci- dessus, pour en deduire le chiffre apres la virgule.

    Aurais tu donc une idée pour fair ce ceux-ci ?!

    Merci encore.

     

     

    Dim valeurC As String
            valeurC = "55A0" ' h = 2 octets : 55 h = 85 d

            Dim octet1H, octet2H As String
            octet1H = Mid(valeurC, 1, 2)
            octet2H = Mid(valeurC, 3, 2)

            Dim octet1D, mantisse As Integer
            octet1D = Convert.ToInt32(octet1H, 16) ' H(string) en D
            mantisse = Convert.ToInt32(octet2H, 16)

            Dim octet1B As String
            octet1B = Convert.ToString(CLng(octet1D), 2) ' D(string) en B : 01010101 = 85 d
            Do While Len(octet1B) < 8 ' format à 8 bits (0 devant)
                octet1B = "0" & octet1B
            Loop

            Dim octet1C As String
            octet1C = Convert.ToString(CLng(mantisse), 2) ' D(string) en B : 10100000 = 160 d
            Do While Len(octet1B) < 8 ' format à 8 bits (0 devant)
                octet1C = "0" & octet1C
            Loop

            Dim signe As Byte
            signe = CByte(Mid(octet1B, 1, 1))
            If signe < 0 Then mantisse = mantisse * -1

            Dim exposantB As String
            exposantB = Mid(octet1B, 2, 4)

            Dim virguleB As String
            virguleB = Mid(octet1B, 6, 3)

            Dim exposant As Integer
            exposant = Convert.ToInt32(exposantB, 2)

            Dim virgule As String
            virgule = virguleB & octet1C
          

            virgule = Convert.ToInt32(virguleB, 2)

          '  Dim formule As String
          '  formule = mantisse & "E+" & exposant & " (virgule = " & virgule & ")"

            Valeur = 2 ^ (exposant - 7) * (1 + virgule)

     

     

    Ps: Ton CV en image est génial . Je conseil aux amis lecteur de faire un tour sur le Site de EhJoe, il y a plein de chose interessante...!

    vendredi 7 janvier 2011 16:17
  • Va voir sur le forum vb6

    http://social.msdn.microsoft.com/Forums/fr-FR/vb6fr/threads

    J'ai posé la question et une personne compétente a répondu (Jean-Marc Noury) ...

    Pou tes données, tu m'as dit 1 4 3 :  8 je sui parti dessus, si chat change ....

    @+, cordialement.



    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe vendredi 7 janvier 2011 18:30
    • Marqué comme réponse Sinki42 vendredi 7 janvier 2011 22:37
    vendredi 7 janvier 2011 18:30
  • Bonsoir,

    Je suis desolé si on c mal compris. C l'espace entre la fin du premier octet et le debut du suivant qui t'a induit en erreur je pense.

    J'ai suivi le lien de ton post precedent (Jean-Marc Noury), il repond a la question de l'extraction de bits, comme le fait tres bien ta fonction. Mais ma fraction binaire sur la mantisse me fait toujours bataillée.

    Je vais poser la question sur le forum VB6, peut-etre que quelqu'un aura une solution simple.  A moins que tu ais dejas la solution....!?

     

    Bonne soirée a toi.

    vendredi 7 janvier 2011 20:47
  • Hello EhJoe,

    Grace a toi, jean-marc Noury, a pu resoudre mon probleme.

    Merci d'avoir pris le temps de poser la question sur d'autre chat.

    Bonne soirée ,

    Bon Weekend.

    vendredi 7 janvier 2011 22:40
  • De rien Sinky42, Jean-Marc était le gand spécialiste (entre autres) des bits en vb6, sur l'ancien forum où il était MVP, il est très compétent sur une grande étendue de domaines, tu peux s'il a laissé un mail dans son profil, lui écrire aussi.

     



    Si ma réponse est utile cliquer en haut à gauche sur le triangle vert.
    Et
    Si la question est résolue, cliquer en bas sur : "Proposer comme réponse"


    Cordialement

    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    samedi 8 janvier 2011 05:15