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

Langage Java Discussion :

[debutant] construire un float a partir de bytes..


Sujet :

Langage Java

  1. #1
    Membre régulier Avatar de Merfolk
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    170
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 170
    Points : 113
    Points
    113
    Par défaut [debutant] construire un float a partir de bytes..
    Bonjour,

    Aidez moi svp car je suis devant un problème très con mais carrément au dessus de mes compétences...

    Le problème :

    je veux lire des paquets de 4 octets dans un fichier et les mettre dans un float.
    J'arrive à récuperer les blocs de 4 octets, mais après, euh, c'est quoi la formule magique pour en faire une variable de type float ?

    Après une bonne trentaine d'essais je suis tombé sur ça, mais c'est complétement foireux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    try
    		{
     
    			FileInputStream fis  = new FileInputStream( cheminFichierData );
    		    BufferedInputStream lecteur = new BufferedInputStream( fis );
     
    			for (int i=0 ; i < nbCoupes; ++i)
    			{
    				for (int j=0 ; j < hauteur; ++j)
    				{
    					for (int k=0 ; k < largeur; ++k)
    					{
    						byte[] quatreOctets = new byte[4];
     
    						int nbBytesLus = lecteur.read(quatreOctets,0,4);
    				        if (nbBytesLus!=4)
    				        {
    				        	Erreur.erreur("nb bytes lus different de 4");
    				        }
     
    				        int x= 255 & quatreOctets[0];
    				        int y= 255 & quatreOctets[1];
    				        int z= 255 & quatreOctets[2];
    				        int t= 255 & quatreOctets[3];	
     
    						lesCoupes[i][j][k].r=x;
    						lesCoupes[i][j][k].g=y;
    						lesCoupes[i][j][k].b=z;
    						lesCoupes[i][j][k].a=t;
     
     
    						lesCoupes[i][j][k].col = 16777215*t+65535*z +255*y+x ;
    					} 
    				}
    			}
     
    			lecteur.close();
    			fis.close(); 
    		}
    		catch(Exception e)
    	  	{
    	  		Erreur.erreur("erreur lors de la lecture de la coupe");	
    	  	}
    qqn a une idée ?
    J'ai bien les paquets de 4 bytes, l'execution marche le fichier a la bonne taille etc., mais par contre les valeurs des floats sont complétement erronées..
    Chasseur de bug en activité
    L'erreur est humaine, mais pour vraiment foutre le bordel, on a besoin d'un ordinateur

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,
    L'erreur vient peut etre du fait que les bytes sont signés en java (valeurs de -128 à +127) si tu veux des valeurs non signées(0 à 255), il faut que tu fasses une conversion.
    J'espère que ca t'aidera.
    [edit]
    Regarde aussi la classe DataOutputStream : elle te permet d'écrire des float (dans une FileOutputStream par exemple). Ca t'évitera peut etre cette conversion aller et retour.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 76
    Points : 88
    Points
    88
    Par défaut precise
    tu oublie de preciser un truc important.

    est-ce le contenu de tes octets qui doivent aller dans un float ou est-ce la valeur de tes octets??

    exemple avec un int:

    si ton octet vaut 065, cela veut dire qu'il represente d'après la table ascii le caractère 5. Mais sa valeur est 65. L'int vaudra 5 ou 65 ???

    de même pour ton float, si ton byte[] = {065, 066, 067, 068}, tu veux que ton float valle:
    - 5678
    ou
    - 68 + (67 * 255) + (66 * 255 * 255) + (65 * 255 * 255 * 255)

    dans le deuxieme cas le code que tu donne est bon, dans le premier il te faut juste faire

    (unFloat[i] - '0') * 10^i (ou un truc com ca)
    Waddle

  4. #4
    Membre régulier Avatar de jerome.petit
    Inscrit en
    Novembre 2002
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 78
    Points : 96
    Points
    96
    Par défaut
    Pour convertir tes bytes en float :

    D'abord il faut savoir dans quel ordre sont tes bytes (poids fort en tête ?)

    Puis :

    construit un int à partir de 4 byte b0, b1, b2, b3:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int bits = (b0 << 24) || (b1 << 16) || (b2 << 8) || b3;
    et enfin convertit en float

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float f=Float.intBitsToFloat(bits);

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

Discussions similaires

  1. construire bufferedImage à partir de byte[]?
    Par baraa M dans le forum Général Java
    Réponses: 1
    Dernier message: 16/10/2012, 22h59
  2. Initialisation float à partir d'un flux
    Par zephyr dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 13/03/2006, 09h56
  3. [Conception] Construire une image à partir d'un tableau
    Par jacques_henry dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/02/2006, 14h53
  4. Réponses: 18
    Dernier message: 08/08/2005, 20h52
  5. Réponses: 2
    Dernier message: 04/06/2004, 10h36

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