Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010
-
1 avril 2005 à 20:56
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010
-
2 avril 2005 à 11:21
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 !
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 1 avril 2005 à 22:30
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.
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 2 avril 2005 à 10:15
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.
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010 1 avril 2005 à 21:37
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010 1 avril 2005 à 21:58
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" ?
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010 1 avril 2005 à 22:07
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 ?!
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 1 avril 2005 à 22:09
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
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010 1 avril 2005 à 22:23
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 ?
Chouchensb
Messages postés64Date d'inscriptionjeudi 3 mars 2005StatutMembreDernière intervention 2 septembre 2010 2 avril 2005 à 11:21
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.