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

C++ Discussion :

Convertir un type REAL 6 octets (PASCAL) en float 4 octets


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut Convertir un type REAL 6 octets (PASCAL) en float 4 octets
    Bonjour,


    Voilà je lis un fichier binaire qui a été réalisé par une application dévellopé en pascal.Dans ce fichier binaire, il a des variable de type "Real" qui ont donc une taille de 6 octets.

    Le probleme c'est que je n'ai pas de type de variable en c++ avec une taille de 6 octets. (float-> 4 octets, double-> 8 octets) .


    CFile INFILE(FichierBinALire,CFile::typeBinary | CFile::modeRead | CFile::shareDenyNone) ; // ouverture en lecture d'un fichier binaire

    INFILE.Read(&m_bypremierOctet,1); //type BYTE 1 octet
    INFILE.Read(&m_bydeuxiemeOctet,1); // type BYTE 1 octet
    INFILE.Read(&m_ctroisiemeOctet,1); // type char 1 octet



    INFILE.Read(& ????????????????????????,6);// COMMENT FAIRE SVP ??



    INFILE.Close(); //fermeture

    En conclusion : Comment puis je lire une variable de taille 6 octets en c++ ????

    Merci beaucoup !
    Au faite, je suis débutant.....!!
    Merci beaucoup

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Par défaut
    perso, j'essaierai un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //...
    char tmp[8];
    Read(tmp, 6);
    double res = *(reinterpret_cast<double*>(tmp));
    En espérant que ça marche

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hio,
    Citation Envoyé par bountykiller
    perso, j'essaierai un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //...
    char tmp[8];
    Read(tmp, 6);
    double res = *(reinterpret_cast<double*>(tmp));
    En espérant que ça marche
    Ça ne marchera pas.

    Comment veux-tu que ton compilateur devine le format des réels sur 6 octets du Pascal ?

    Je vois 2 solutions "simples"

    - En Pascal, tu relis le fichier et tu en crées un autre, soit binaire (en remplaçant le type Real (6 octets) par le type double ou float (idem des C/C++), soit au format texte (je préfère cela, ça évitera les éventuels problèmes d'alignement des données dans la structure).

    - un peu plus compliqué : tu cherches la définition du format du type réel su 6 octets du Pascal, et tu te fais une petite fonction pour convertir ves float ou double.

  4. #4
    Membre habitué
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut
    Bonjour,

    Tout d'abord,je tiens à vous remercier pour les réponses apportées.

    Pour bountyKiller -> j'ai déjà essayé cette solution mais cela me marche pas ça me donne n importe quoi.

    Pour droggo -> j'aimerai effectivement convertir le type "Real"(6 octets) du pascal en "float"(4 octets) du c++ en utilisant ta 2e proposition qui me paraît la mieux adapté à mon problème en créant un fonction de conversion.

    D'aprés les informations sur internet concernant les formats , on a :

    Pour le type real du pascal : il est codé sur 48 bits ( 6 octets)

    -> 1er bit pour le signe taille: 1 bit
    -> du 2e bit au 8e bit pour l'exposant taille: 7 bits
    ->du 9e bit au 48e bit pour la mantisse taille: 40 bits

    Pour le type float du c++ : il est codé sur 32 bits ( 4 octets)

    -> 1er bit pour le signe taille: 1 bit
    -> du 2e bit au 9e bit pour l'exposant taille: 8 bits
    ->du 10e bit au 32e bit pour la mantisse taille: 23 bits


    Dans mon fichier binaire, je dois lire quand même 6 octets, sur quelle type de variable puis je les stocker ???

    Et puis le plus important, je dois savoir comment on lit un bit et comment on ecrit un bit en c++ !

    En conclusion j aimerais :

    1)lire les 6 octets dans un fichier binaire
    2) lire les 32 bits qui m'interresse sur ces 48 bits
    3)ecrire ces 32 bits pour donner la valeur à ma variable de type float

    j imagine un fonction de convertion real en float du type :

    ConvertRealToFloat( type6Octets??? MaVarReal, float& maVar)
    {

    .....

    .....???


    }

    En tous cas, merci beaucoup d'essayer de me répondre !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 14
    Par défaut
    salut,

    Si tu veux une solution simple :
    avec une routine écrite en pascal , crée un fichier texte par exemple une ligne pour chaque réel,
    puis avec une routine en c++ , tu lit le fichier texte et tu converti le chaines de caractères en float.
    a+

  6. #6
    Membre habitué
    Inscrit en
    Février 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 9
    Par défaut
    bonjour,

    Mecri pour la réponse.En fait mon application fonctionne en même temps que l 'application dévelloppé en pascal.

    L'application en pascal crée un fichier bin des trames de 783 octets, et moi je cré un fichier txt avec des donnees que je mets plus des données qui me faut récuperer en temps réel sur le fichier bin.

    Je ne peux absolument pas touché a l'application dévellopé en pascal, en effet, il suffisait par exemple de remplacer le type Real en pascal par string dans le code source , mais dommage je ne peux pas !

    Je ne pense pas que ajouté une 3 e application (la routine) qui tourne en même temps que les 2 autres serait bien !

    Je cherche tout simplement un moyen de convertir un "real" (pascal) en "float" .Je pense sincçèrement que la meilleur methode est de comparer le codage de ces 2 formats (signe,exposant,mantisse), et de mettre en place une fonction pour une lecture / ecriture bit par bit...comme dis précédement.

    Au fait, en plus je ne connais du tout le pascal!!

    En tout cas merci beaucoup pour vos réponses, en espérant que quelqu'un puisse apporté un peu de lumière à ce problème !!!

    A bientôt !!!

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

Discussions similaires

  1. convertir un type octet-string
    Par Cedrci35 dans le forum WinDev
    Réponses: 6
    Dernier message: 24/03/2010, 09h43
  2. Convertir le type d'un champ
    Par mat75019 dans le forum Access
    Réponses: 2
    Dernier message: 21/04/2006, 11h49
  3. [MS SQL] Est il possible de forcer la précision du type REAL
    Par TEXMEX dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/04/2006, 17h31
  4. [LG]Convertir le type double en string
    Par @tom@ dans le forum Langage
    Réponses: 8
    Dernier message: 18/01/2004, 19h20
  5. Convertir un type de donnée sous SQL Server
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2003, 15h15

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