Lire un nb codé en 64bits (IEE754) et contenu dans un fichier binaire

Résolu
Signaler
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
-
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
-
Bonjour,

J'ai un fichier binaire qui contients des nombres codés en 64 bits selon la norme IEEE 754 et je souhaiterais pouvoir les lire (avec un programme en VB). Je ne sais pas comment m'y prendre. J'ai essayé le code suivant, mais cela ne marche pas:

Dim Filenum As Integer
Dim Value as Double

Filenum = FreeFile
Open "c:\data.bin" For Binary As Filenum
For i =1 To LOF(Filenum) Step 8
Get #Filenum, i, Value
MsgBox Value
Next i
Close Filenum

Voilà, voilou, je sais pas comment faire, ce code me lit n'importe quoi.... HELP !

12 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
les nombres en mémoire sont toujours inversés, poids le plus faible
avant, poids le plus fort à la fin. d'où l'idée ... comment la chaîne a t-elle été écrite, il y avait 2 cas.

si ton problème est résolu, penses à cocher réponse acceptée.

Daniel
3
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
L'explication viens probablement de la convention Endian utilisée à l'écriture du fichier.



Comme le disait Daniel les nombres peuvent etre écrit soit
l'octet de poids fort en premier soit l'octet de poid faible en premier



Les systèmes basés sur les processeurs Intel (et compatible) sont
habituellement en convention Little Endian, c'est le cas de windows.
Dans ce cas c'est l'octet de poid faible qui est écrit en premier.



Les systèmes basés sur les processeurs Motorola (Unix notamment, mais
aussi Sun et MacOS), sont habituellement en Big Endian. Dans ce cas,
c'est l'octet de poid fort qui est enregistrer en premier.

Si ton fichier viens du monde Unix, il faut effectivement que tu fasse une convertion.



Petite subtilité, le logiciel LABVIEW de National Instrument enregistre
ses données en Big Endian bien que fonctionnant sous Windows
(Little Endian), utile à savoir lorsque on veut relire directement les
fichiers écrits avec ce logiciel (et pas forcement facile à trouver
comme bug).





<hr size="2" width="100%">Si le cerveau était assez simple pour que nous puissions le comprendre,

nous serions assez bête pour ne pas le comprendre malgré tout.
3
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
Dim x As Double
Dim i As Integer
Dim nb As Long
Dim c As String

c = Space$(8)
Open "c:\data.bin" For Binary As #1
nb = LOF(1) \ 8
For i = 1 To nb
Get #1, , c
CopyMemory x, ByVal c, 8
MsgBox x
Next
Close #1

Daniel
0
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
Salut Gobillot,

Tout d'abord un grand merci pour ton aide !

J'ai essayé ton code, mais je comprend pas tout: qu'est ce c'est l'instruction CopyMemory ? Je travaille en VBA sous Excel et l'instruction n'est pas reconnue...
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
j'avais oublié de le mettre, j'espère que ça marche en VBA ?

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Daniel
0
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
Alors l'instruction est bien reconnue, mais ça n'a pas l'air de fonctionner correctement: ca me donne toujours des nombres pas cohérents par rapport à ceux qui avaient été enregistrés dans le fichier (c'est un appareil de mesure qui m'a enregistré les valeurs dans le fichier). Les nombres sont enregistrés à la suite des uns des autres sur 8 octets et sont codés en format IEEE754. Je sais pas si le problème vient du format IEEE ou d'autre chose... Peux tu m'expliquer ce que fait la ligne "CopyMemory x, ByVal c, 8" ?
0
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
Au fait, juste une petite remarque:

Ton code lit bien les bonnes "portions" de fichiers (de 8 octets). Donc il semble que ce soit la conversion en double qui ne marche pas très bien. Si tu as une idée ?!
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
CopyMemory ça copie les huit octets de la chaîne dans un double sans faire aucun calcul.
si tu connais une valeur que tu dois retrouver par exemple ici x=123.456 essayes de comparer avec le résultat obtenu dans le fichier test.bin:

Dim x As Double
Dim c As String

Open "c:\test.bin" For Output As #1
x = 123.456
c = Space$(8)
CopyMemory ByVal c, x, 8
Print #1, c;
Close #1

Daniel
0
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
je pensais qu'il est peut être possible que la chaîne soit écrite à l'envers.
si tu as StrReverse essayes de retourner la chaîne avant le CopyMemory:

c = StrReverse(c)
CopyMemory ByVal c, x, 8

sinon il me faudrait un exemple, c'est à dire une chaîne de 8 caractères représentant un nombre et le nombre correspondant.

Daniel
0
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
Alors là je dis BRAVO !!!! T'as résolu mon problème en une heure top chrono ! Si c'est pas de l'efficacité ça !!!! Effectivement, il faut faire un StrReverse(c). T'as trouvé ça comment ?
0
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
En tout cas, merci beaucoup pour ton aide ! Et bon WE.
0
Messages postés
64
Date d'inscription
jeudi 3 mars 2005
Statut
Membre
Dernière intervention
2 septembre 2010
1
Effectivement, il est bon de connaitre ce petit détail si l'on veut s'épargner des heures et des heures de transpiration devant son PC (comme j'ai pu le faire !). Je retiendrai l'info ;o)
Je vous remercie tous les deux pour votre aide.
0