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 :

[NIO]Lire un fichier binaire


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 77
    Points : 463
    Points
    463
    Par défaut [NIO]Lire un fichier binaire
    Bonjour.
    Pour mon projet, j'ai besoin de charger des modèles 3D dans mon application OpenGL (j'utilise LWJGL). Mais comme il s'agit d'une API bas niveau, il faut que je développe les chargeurs de modèles moi même. J'ai donc choisis le format 3DS, conseillé par mon modéliseur/dessinateur 3D.
    J'ai un peu étudié le probleme et j'ai surtout trouvé des exemples en C. D'après ce que j'ai compris, les fichiers 3DS sont des fichiers hexadécimaux. Chaques "chunks" à une valeur. On peut un peu comparer ces fichiers à des fichiers XML avec leur hierarchie (parent/enfants...).
    Donc je dois lire ces fichiers, obtenir les valeurs hexadécimales, puis recuperer les données dont j'ai besoin pour les transmettre à OpenGL.

    Pour l'instant ce que j'aimerai faire c'est lire un de ces fichiers et afficher son contenu.
    Pour une question de performance évidente, je compte utiliser les NIO. Malheuresement, malgré la javadoc et les quelques exemples trouvés sur des sites anglais, je n'arrive toujours pas à lire et afficher ces fichiers 3DS.

    Ensuite je ne sais pas si il vaut mieux mapper le fichier en mémoire ou lire le fichier en stream. Le premier est plus rapide mais j'ai besoinde lire bytes par bytes le fichiers pour récuperer des données du genre 0x4D4D ou 0x4110...

    Donc est-ce que quelqu'un pourrait m'expliquer comment lire un fichier binaire et l'afficher avec les NIO et si possible avec un petit code ?
    Ça m'aiderait beaucoup.

    Merci d'avance.

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 77
    Points : 463
    Points
    463
    Par défaut
    Bon j'arrive à lire un fichier texte, mais pas un fichier hexa.
    Voilà monde code :
    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
    	public static String readFile(File a_file) throws IOException {
    		FileInputStream fin = new FileInputStream(a_file);
    		FileChannel fc = fin.getChannel();
    		ByteBuffer buffer = ByteBuffer.allocate(4 * 1024);
    		StringBuffer l_stringBuffer = new StringBuffer();
    		while (fc.read(buffer) != -1) {
    			byte[] l_bytes = buffer.array();
    			String s = new String(l_bytes, 0, buffer.position());
    			l_stringBuffer.append(s);
    			buffer.clear();
    		}
    		String retour = l_stringBuffer.toString();
    		System.out.println(retour);
    		return retour;
    	}
    Mais si je lis un fichier .3ds, j'obtiens...rien, peut-être pendant un dixieme de seconde quelque que chose comme MMo suivis d'un caractère bizzard, puis plus rien...

    Si quelqu'un sait comment lire ce genre de fichier avec les NIO, merci d'avance.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 77
    Points : 463
    Points
    463
    Par défaut
    Ah non enfaite j'obtiens ça :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    MMo
    ==(>=
    ÿ¯ì 
    APE ▒   kU      b6$  ▒  y       RCm0 ▒  ÿÿÿ     ÿÿÿ@ 9A NP R S   
    ?¢.d£APE.CELQS£
    ÍÌÌ=ÿ¯ú ASPHALT ▒
     
     
                                      ▒     ?=8     0 ▒     |xq     FB;@ A P R S    
    ¢2d£ASPHALT.JPGQS£
     
    ×£=ÿ¯ AMOEBA PATTERN ▒  C6C       ▒     t       U>T0 ▒  áà×     ÌÊŒ@ A ▒P R S    
    ?¢2d£PAT0107.TGAQS£
    ÍÌÌ=
    ?pH pÏp7Àh`å
                ? AðAamera01p7¿Àh`å
                                   ?amera01p7wÀhÿÿ`å?@ACamera01p7¿wÀh`å
                                                                       ? AðAamera01p7üÿ?amera01p7Àh`å
                     ? AðAamera01p7¿Àh`å
                                        ?amera01p7wÀhÿÿ`å?@ACamera01p7¿wÀh`å
                                                                            ? AðAamera01p7üÿ?amera01
    ?P
    @@`
    ?!▒¡  =¡  =¡  =*v?".zDÈB???"#(ÈB????#zDÈB#000
                                                 MáÁ:M
    Âu2BãC@5Box01A)AÀÂ/m®ÂïÃRÂĪÝB/m®ÂïÃRÂĪÝBx²BöÃRÂÀÂx²BöÃRÂÀÂ1m®Â©!ÏÂĪÝB1m®Â©!ÏÂĪÝBv²B­!ÏÂÀÂv²B­!ÏÂ@A=▒Ÿñ>|,A?ûc_>³?õB▒?(>     [?=▒Ÿés>|,A?=▒
                                                                  »³?·»Ã>(>ê£"?pA\?? h@°▒wÂ?æ[_?,ú>
    $l°6šØŸ>oA?¿,zŸæ[ß>׳]????A`A6?HDŽÿÿ¿ÿÿ?HDŽè@ºh?ÒAÂeA AÂ
                                                            0A$APE
     
     
    P  @ÕCone01AÈA@▒Èûõ@hYd@W%CÜ3¢@ZÀW%CÌèÝ@ªRÁW%CLAÁW%CohšA{±ÁW%C÷&ìAD¢ÁW%C·­B{gÁW%Cµ&▒B(ÆÀW%C°Bô@W%C§öAñ¥
    AW%CøqŽAö4AW%CØfaA{¯AW%C2m.Â[Bj{8µîó^Âûû¿: 6Ò^<ÂÏ$ÂöB#7#äÁÁžÂ³f7ãAü¥Â3»7p8fB±ÂWùm7.m®B`ö<Â=ß07°ÆBYýÁÓµ6fµBahòA&$4L_~B%ÖoB[¶PÊAl.BÉ=ž¶ò,_ÁÕÇ}B±C¶1m®Am®ÀW%C1m®AJm®ÀW¥6@AØ▒§W>É­a?N>É­a»>É­a?dÎÜ>É­a?Û<ý>É­a?5É?É­a?▒?É­a?p1?É­a?²(F?É­a?©/_?É­a?I}?É­a?¹ß=É­a?[->H©`=~>H©`=ë«>H©`=xÔ>H©`=Hü>H©`=@C?H©`=ó&?H©`=(S;?H©`=ÈáP?H©`=!3g?H©`~?H©`=.C§=H©`=ûÿÿ>É­a?ûÿÿ>H©`=pA\??4m®Ax²B???????A<▒`A6?HDŽÿÿ¿ÿÿ?HDŽ1m®A:m®ÀW¥BeA AÕ0▒
    
    
    
    
    
    
    
    
     
    
     
     
    
     
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
                                                                                   0AhASPHALT,
     
     
    ▒▒!#$%&'()*+,-./0AAMOEBA PATTERN"PAÆ@ICamera01G:çÃØ:DÃ@C`KAAa▒BG GzD@CCamera02G4ç{_ChÂhÂêʪBhÁåÑÁÿÿGB GzD@ÄHSph01A·AÔžÎÃæÑBîbA/iÍÂþB¯Ú,?Pî¬▒wB€Ž?ý$ÃÂY»B
                                                                              ùk?ÆþÂÚBk­¿ÃË ÅB7^À~.ÃrBäy1À³M$ÃlBË%ÀMÃ2m®A¢ðZ¿ÍÒ±ÂéZAÂá)Â{ÂUqBÕ·%ÂøM£ÂóÃÒB¶|(Âi÷Âv(þB'0ÂâÃ(ÃMáBu99ÂÁo>ÃBgc=ÂK0Ã]ËA:ÂŒøïio@2ÂA*`A6Ž?1žD=žD!
                                                          ŽŽ¿1ÿÿ!
                                                                 Ž°RÃäÑBRžWÁeA Av
     
     
     
     
     
     
     
     
     
     
     
     
     
                    PA~°7
    pH pÏp7Àh ±A?
                 MáÁ:M
    Âu2B AðAamera01p7¿Àh ±A?
                            MáÁ:M
    Âu2Bamera01p7wÀh~|?
                       MáÁ:M
    Âu2B@Aamera01p7¿wÀhÝh;?6GÂZ»âÁÜÑ%> AðAamera01p7wÀh~|?
                                                         MáÁ:M
    Âu2B@Aamera01p7Àh ±A?
                         MáÁ:M
    Âu2B AðAamera01p7¿Àh ±A?
                            MáÁ:M
    Âu2Bamera01p7wÀh~|?
                       MáÁ:M
    Âu2B@Aamera01p7¿wÀhÝh;?6GÂZ»âÁÜÑ%> AðAamera01p7wÀh~|?
                                                         MáÁ:M
    Âu2B@Aamera0°   °
    °²0°Box01p@ÿÿ° °&@è@ºh?ÒAÂ!°*@ÜÉ??"°&@???°
    PwÖ>°³0°Cone01p@ÿÿ° °&@1m®A:m®ÀW¥B!°*@ÜÉ??"°&@???°
    PwÖ>°I0°Camera01ÿÿ °&@`KA°0°Camera01pÿÿ °&@çÃØ:DÃ@C#°@|B$°@A°I0°Camera02ÿÿ °&@êʪBhÁåÑÁ°0°Camera02pÿÿ °&@ç{_ChÂhÂ#°@@B$°@°y0°HSph01p@ÿÿ° °pC°RÃäÑBRžWÁ¿PôÂòxB=¬¢ÁÍÌÌ>)\¿ž>?¶³²ÂäÑB|rÀÁ
    °RÃäÑBRžWÁ!°V@º"É?FÚ?¹Ä<¹Ä<Vè>Ž¿²žDœPwÖ>Ž¿À±·Dœ"°J@???H¿??ZEC???)°°
    PwÖ>°J0ÿÿ°$AMBIENT$ÿÿ%°&@¡  =¡  =¡  =
    Ques des caractères spéciaux même si des fois on peut aperçevoir des données en caractères normaux.

    Personne ne sait comment je pourrais obtenir un code hexadécimal, avec lequel je pourrai trouver mes données nécessaires comme : 0x4D4D...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    A priori, je dirai que ta lecture en byte est correcte, mais c'est quand tu transformes en String et que tu affiches que tu ne fais pas ce que tu veux...

    Si tu convertis ton tableau de bytes en String et que tu l'affiches, c'est comme si tu lisais ton fichier en ASCII directement...

    Il te faut recuperer les valeurs hexa de ton tableau de byte pour les afficher...

    J'avais fait un p'tit truc pour avoir les valeurs decimales a partir d'un byte... Y'a probablement mieux, mais ca marchait...
    En gros, ca donnait ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      // converts char contained in Source String in its int value.
      private int charToInt(String Source)
      {
        byte[] byteValue = Source.getBytes();
        int S = new Integer(byteValue[0]).intValue();
        if(S<0)
        {
          S = 256+S;
        }
     
        return S;
      }
    A preciser que le String Source ne contient qu'un seul charactere...

    Bien sur, par rapport a ca, tu n'as pas besoin de convertir ton String en byte, vu que tu as deja la source en byte... Il suffit de prendre ton tableau de byte, et de convertir les valeurs une a une... Tu auras la valeur decimale... il suffit d'adapter pour convertir en hexa...

Discussions similaires

  1. Comment bien lire un fichier binaire ?
    Par domiq44 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 12/01/2007, 08h38
  2. Lire un fichier binaire
    Par vancim dans le forum Pascal
    Réponses: 3
    Dernier message: 20/10/2006, 02h13
  3. comment lire des fichiers binaires
    Par compton dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 06/07/2006, 12h03
  4. [C#] Lire un fichier binaire
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 02/06/2006, 18h08
  5. lire un fichier binaire 8bit apr 8bit
    Par lykim dans le forum Entrée/Sortie
    Réponses: 21
    Dernier message: 12/05/2006, 17h09

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