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

Entrée/Sortie Java Discussion :

Initialisation float à partir d'un flux


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Initialisation float à partir d'un flux
    Bonjour a tous,

    Voila mon probleme :

    j'ecrit par exemple un simple float en binaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    float f = 3;
    DataOutputStream flux = new DataOutputStream(new FileOutputStream("mon file"));
    flux.writeFloat(f);
    flux.close();
    et je lit grace a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DataInputStream flux = new DataInputStream( new FileInputStream("mon file")) ;
    float b = flux.readFloat();
    Ceci marche tres bien , le probleme c'est que ce fichier binaire doit etre recupéré avec un programme c++

    le programme c++ qui lit mon fichier binaire ne me retourne pas le meme float que je sauvegarde avec mon prog java.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FILE *f = NULL;
    float a = -1;
    f = fopen("java.raw","rb");
    if(f == NULL)
    	cout << "lecture Impossible" << endl;
    else
    {
    	fread(&a,sizeof(float),1,f);
    	fclose(f);
    	cout << "on recupere " << b << endl;
    }
    Donc la question c'est y a t'il une inversion de byte ??
    ou un decalage de byte ??
    qui fait que l'echange de fichier binaire entre c++ et java n'est pas possible.


    merci par avance .

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    En Java, le float est écrit dans le fichier en big endian (le bit de poids fort du premier octet écrit est le bit de signe du nombre) d'après le javadoc des classes java.io.DataOutput et java.lang.Float.

    En C++, cela dépend de ta plateforme.
    A priori, sur un PC, il faut que tu échanges les octets.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta reponse ca confirme ce que je pensais.

    Le probleme c'est que je sait pas inverser les bites en java sur un float


    Peux tu me dire comment faire ?


    sinon je fais un cast de float en int

    ensuite j'utilise toBinaryString();

    est avec cette chaine je m'arrange pour faire mon inversion.

    Mais y a t-il pas un moyen plus efficace et surtout sur des float ??

    Merci

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    Il faut inverser les octets, non les bits.

    Pour inverser les octets d'un float, mieux vaut passer par un int.
    Voici une façon d'inverser les octets d'un entier i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    i = ((i >> 24) & 0xFF) |
         ((i >> 8) & 0xFF00) |
         ((i & 0xFF00) << 8)  |
         ((i & 0xFF) << 24);
    Il y a surement mieux, mais cela devrait marcher !

    En 1.5, il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = Integer.reverseBytes(i);

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci PK960

    Pour les entier ca marche, c'est deja tres bien.

    Mais je vais encore vous embeter !!

    J'ai essayé quand meme de le faire pour mon float.

    Donc j'ai mon entier dont j'inverse les octets, ensuite je le cast en float est je sauvegarde.

    mais ca ne marche pas .

    Donc si quelqu'un a une idée ??

    -> en tout cas merci beaucoup de tes reponses rapide PK960

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    Il ne faut pas caster l'entier en float mais passer par f = Float.intBitsToFloat(i); car l'entier i contient la représentation binaire du flottant et non un nombre entier.
    Dans l'autre sens, il faut passer par i = Float.floatToIntBits(f);

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Salut , bon desolé de répondre seulement maintenent mais je n'avais aucun accés au web ce week.

    pk960 -> j'ai essayé de faire f = Float.intBitsToFloat(i); mais aucun resultat je recupere un float erroné

    voici ce que j'ai fait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int i = 9;
    i = Integer.reverseBytes(i);
    float j = java.lang.Float.intBitsToFloat(i);
     
    DataOutputStream oos2 = new DataOutputStream(new FileOutputStream("java.raw"));
    oos2.writeFloat(j);
    oss2.flush();
    oos2.close();
    Ai - je fait une erreur ??

    merci d'avance

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Personne a une idée ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    Ce code à modifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = 9; 
    i = Integer.reverseBytes(i);  
    float j = java.lang.Float.intBitsToFloat(i);
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int i;
    float j = 5.0;
    i = Float.floatToIntBits(j);
    i = Integer.reverseBytes(i);
    //Et tu ecrit ton "i" dans ton fichier ^^
    Si j'ai bien compris sa devraiit mieux marcher comme cela

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    merci anykeyhde de ta réponse

    bon j'ai pas testé ton bou de code , mais avec ceci je sauvegarde dans mon fichier texte un entier non ???

    si c ca pour les entier j'ai reussit.

    je voudrais a present enregistrer un float.

    Merci

    ==> j'ai tester ca ne marchepas

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Cool finalement c bon


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int i;
    float j = 9;
    i = Float.floatToIntBits(j);
    i = Integer.reverseBytes(i);
    j = Float.intBitsToFloat(i);
     
    DataOutputStream oos2 = new DataOutputStream(new FileOutputStream("java.raw"));
     
    oos2.writeFloat(j);
    oos2.flush();
    oos2.close();
    apparement comme ca c'est bon.


    En tout cas merci a ce qui mon aidé.


    ++

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

Discussions similaires

  1. [XSLT][JavaScript] Transformation à partir d'un flux xml
    Par tatemilio2 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 21/07/2009, 12h16
  2. Affichage video à partir d'un flux d'images
    Par enenkey dans le forum DirectX
    Réponses: 8
    Dernier message: 15/12/2006, 01h23
  3. [DOM XML] Créer une image à partir d'un flux XML
    Par Just dans le forum Bibliothèques et frameworks
    Réponses: 13
    Dernier message: 09/11/2006, 18h33
  4. [debutant] construire un float a partir de bytes..
    Par Merfolk dans le forum Langage
    Réponses: 3
    Dernier message: 17/12/2004, 20h53

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