Bonjour,
Je dois lire un fichier qui a été généré par un programme gwbasic (DOS).
Celui ci est composé des zones textes que je peux facilement récupérer et de zones 'binaires' contenant un réel simple précision.
D'après ce que je comprend en gwbasic pour enregistrer un réel dans une zone de fichier on utilise la fonction MKS$ qui convertie le réel simple précision en une chaine de caractère sur 4 positions.
Ce procédé est utilisé car on ne peut enregistrer autre chose que des chaines dans un fichier gwbasic.
Pour relire cette zone on utilise CVS qui converti ces 4 caractères en réel simple.
J'aimerai pouvoir lire ce fichier depuis Delphi.
J'ai essayé de créer un record :
J'ai un fichier et un enregistrement courant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 EnrTest = record NOM : array[1..20] of char; Chiffre : array[1.. 4] of byte; end;
Je lits un enregistrement après m'être positionné dessus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Fichier : File of EnrTest; CurEnr : EnrTest;
Pour la lecture de la zone texte, pas de probleme par contre le chiffre...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 seek(Fichier, 2); read(Fichier, CurEnr);
J'ai essayé de caster en single :
mais ca ne donne pas le bon résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Single(CurEnr.Chiffre)
J'ai affiché la valeur de chaque byte pour voir comment il pouvait être encodé, mais j'ai l'impression que l'encodage binaire n'est pas simple.
par exemple la valeur 100 (décimal) enregistré dans le fichier avec le programme basic donne ceci dans mes 4 octets (en hexa) :
en binaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 0 0 48h 87h
-100 donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 0000 0000 0000 0000 0100 1000 1000 0111
en binaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 0 0 C8h 87h
j'en conclus que le signe est sur le 1er bit du 3 eme octet. Et que probablement le 3eme et 4eme octets sont les poids forts (héritage de l'architecture 8088 ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part 0000 0000 0000 0000 1100 1000 1000 0111
Mais pour le reste...
la valeur 1 est encodée comme ceci : 0 0 0 81h
la valeur -1 est encodée comme ceci : 0 0 80h 81h
la valeur 2 est encodée comme ceci : 0 0 0 82h
la valeur 4 est encodée comme ceci : 0 0 0 83h
la valeur 8 est encodée comme ceci : 0 0 0 84h
la valeur 16 est encodée comme ceci : 0 0 0 85h
la valeur 32 est encodée comme ceci : 0 0 0 86h
la valeur 64 est encodée comme ceci : 0 0 0 87h
la valeur 128 est encodée comme ceci : 0 0 0 88h
la valeur 256 est encodée comme ceci : 0 0 0 89h
la valeur 512 est encodée comme ceci : 0 0 0 8Ah
la valeur 1024 est encodée comme ceci : 0 0 0 8Bh
la valeur 2048 est encodée comme ceci : 0 0 0 8Ch
la valeur 4096 est encodée comme ceci : 0 0 0 8Dh
la valeur 8192 est encodée comme ceci : 0 0 0 8Eh
la valeur 16384 est encodée comme ceci : 0 0 0 8Fh
la valeur 32768 est encodée comme ceci : 0 0 0 90h
la valeur 65535 est encodée comme ceci : 0 0 0 91h
La valeur 3 est encodée comme ce ci : 0 0 40h 82h
La valeur 5 est encodée comme ce ci : 0 0 20h 83h
La valeur 6 est encodée comme ce ci : 0 0 40h 83h
La valeur 7 est encodée comme ce ci : 0 0 60h 83h
La valeur 9 est encodée comme ce ci : 0 0 10h 84h
La valeur 10 est encodée comme ce ci : 0 0 20h 84h
La valeur 11 est encodée comme ce ci : 0 0 30h 84h
La valeur 12 est encodée comme ce ci : 0 0 40h 84h
La valeur 13 est encodée comme ce ci : 0 0 50h 84h
La valeur 14 est encodée comme ce ci : 0 0 60h 84h
La valeur 15 est encodée comme ce ci : 0 0 70h 84h
La valeur 17 est encodée comme ce ci : 0 0 08h 85h
Bref je ne trouve pas la logique d'encodage.
Quelqu un aurait il plus d'expérience dans ce domaine ou mieux une solution .
Merci d'avoir lu jusqu ici. Si vous avez des questions, n'hézitez pas à demander des précisions.
Partager