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 :

ByteBuffer et asCharBufer()


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut ByteBuffer et asCharBufer()
    Bonjour , dans la cadre d'une série d'exercices sur les tampons,
    j'ai un problème de décodage avec asCharBuffer()

    voici un bout de code où
    - je déclare un ByteBuffer
    - j'utilise la méthode slice()
    - ensuite je teste la méthode asCharBuffer()

    - et malheureusement , je récupère des ?????????? à la place de mon texte
    qui devrait être "Un rapport quelconque..."

    Il s'agit sans doute d'un problème de Charset mais je dois dire que ce n'est pas ma spécialité ...

    Si quelqu'un peut m'aider, MERCI !!!

    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
     
    package tampons_jeter;
     
    import java.nio.ByteBuffer;
    import java.nio.CharBuffer;
    import java.nio.charset.Charset;
     
    public class Essai_Tampon {
        static public void main(String args[]) throws Exception {
            String contenu = "Un contenu quelconque...";
            System.out.println("Tampon d'origine : " + contenu);
            ByteBuffer tampon = ByteBuffer.allocate(contenu.length());
            System.out.println("longueur de la chaine : " + contenu.length());
            tampon.put(contenu.getBytes());
            tampon.flip();
            System.out.print("tampon contenu 1 : ");
            while (tampon.remaining() > 0) {
                System.out.print((char)tampon.get());
            }
            System.out.println();
            System.out.println();
     
            tampon.position(3);
            tampon.limit(10);
     
            ByteBuffer decoupe = tampon.slice();
     
            System.out.print("Sous-tampon : ");
            for (int i = 0; i < decoupe.capacity(); i++) {
                byte o = decoupe.get(i);
                System.out.print((char)o);
            }
     
            System.out.println("\nModification du sous-tampon...");
            decoupe.position(0);
            decoupe.put("rapport".getBytes());
     
            tampon.position(0);
            tampon.limit(tampon.capacity());
     
            CharBuffer cb = tampon.asCharBuffer();
     
            System.out.print("Transformation du Tampon d'origine : ");
            while (tampon.remaining() > 0) {
                System.out.print((char)tampon.get());
            }
            System.out.println();
            //--------------------------------------------------------------------------------------------
     
            // Créer une vue asCharBuffer()
            System.out.println("Créer une vue asCharBuffer()");
     
            while (cb.hasRemaining()) {
                //System.out.print((char)cb.get());
            	System.out.print((char) cb.get());
            }
     
     
     
        }
    }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Pour commencer tu devrais simplifier le problème
    - slice() ne sert à rien
    - modifier le contenu du buffer non plus.

    Ce n'est pas un problème de charset. Le problème, c'est que asCharBuffer() ne sert pas à ça et ne peut pas être utilisé comme ça.

    Essentiellement, asCharBuffer() est la même chose que asShortBuffer().
    Ils veut dire, "là, j'ai une série de bytes contigus, eh ben je veux les prendre deux par deux et les voir comme si c'était une série de shorts contigus." Un byte fait 8 bits, un short fait 16 bits, donc en prenant deux bytes on peut faire un short.
    Les char en Java, c'est pareil, ils font 16 bits, donc avec deux bytes, on fait un char.
    Or toi, tu avais construit tes bytes de sorte que pour un byte, tu aies une lettre, et donc que une lettre prenne un byte. Pas deux. Là chaque char va se construire en prenant deux de tes lettres de départ, ce qui fait des codes unicodes qui pointent un peu n'importe où, en général des idéogrammes.

    Si tu veux un CharBuffer qui représente ta String, tu devrais plutôt utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CharBuffer.wrap(contenu.toCharArray())
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut bonjour thelvin
    Merci de ta réponse

    Pour le slice, je sais (il ne sert à rien) mais je suis en train de faires des exercices tout azimut

    Concernant tes explications, je comprends l'erreur mais ce que je comprends moins : c'est à quoi sert alors asCharBuffer ?
    je pensais que cela permettait de transfomer un ByteBuffer en CharBuffer et de l'utiliser comme tel

    Peux-tu me donner un exemple d'utilisation de asCharBuffer

    Merci

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Citation Envoyé par michelp3 Voir le message
    Concernant tes explications, je comprends l'erreur mais ce que je comprends moins : c'est à quoi sert alors asCharBuffer ?
    En principe, à la même chose que asShortBuffer(), asIntBuffer(), asLongBuffer(), asFloatBuffer(), et asDoubleBuffer().

    Ce qui signifie en réalité, pas à grand-chose. C'est utile quand tu veux représenter des chars et d'autres choses à l'intérieur d'une séquence de bytes précises.
    Dans ce cas-là, tu auras un ByteBuffer déjà alloué et tu ne veux pas d'autre buffer. Mais un ByteBuffer c'est pas pratique pour stocker ou récupérer des chars. D'où l'idée de prendre une vue de ce ByteBuffer comme si c'était un CharBuffer, et travailler avec ça. Avec les chars ça n'a pas l'air très utile, mais avec des shorts ou des longs, c'est déjà un peu plus parlant.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    accessoirement, pour l'exerice, si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ByteBuffer tampon = ByteBuffer.allocate(contenu.length()*2);
            System.out.println("longueur de la chaine : " + contenu.length());
            tampon.put(contenu.getBytes("UTF-16"));
    t'aura déjà une meilleur compréhension de ce qui se passe

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Thelvin , tchize
    Merci de votre concours,
    En combinant vos explications, j'aboutis au code suivant qui me donne le résultat escompté

    Merci de votre collaboration

    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
     
    package tampons_jeter;
     
    import java.nio.ByteBuffer;
    import java.nio.CharBuffer;
    import java.nio.charset.Charset;
     
    public class Essai_Tampon {
        static public void main(String args[]) throws Exception {
     
            String contenu = "Un contenu quelconque...";
            System.out.println("Tampon d'origine : " + contenu);
            System.out.println("longueur de la chaine : " + contenu.length());
     
            //Méthode 1
            ByteBuffer tampon = ByteBuffer.allocate(contenu.length()*2);
     
            tampon.put(contenu.getBytes("UTF-16BE"));
     
            tampon.flip();       
     
            System.out.print("tampon contenu 1 : ");
            while (tampon.remaining() > 0) {
                System.out.print((char)tampon.get());
            }
            System.out.println();  System.out.println();                        
     
            tampon.position(0);
            tampon.limit(tampon.capacity());
     
          //Méthode 2
            ByteBuffer tampon2 = ByteBuffer.wrap(contenu.getBytes("UTF-16BE"));
            System.out.print("tampon contenu 2 : ");
            while (tampon2.remaining() > 0) {
                System.out.print((char)tampon2.get());
            }
            System.out.println(); System.out.println();                        
     
            tampon2.position(0);
            tampon2.limit(tampon.capacity());
     
            // Créer une vue asCharBuffer() : tampon : Test Méthode 1
            System.out.println("Créer une vue asCharBuffer() tampon");
            CharBuffer cb = tampon.asCharBuffer();
     
            while (cb.hasRemaining()) {
                 	System.out.print((char) cb.get());
            }
            System.out.println();
     
         // Créer une vue asCharBuffer() : tampon 2 : Test Méthode 2
            System.out.println("Créer une vue asCharBuffer() tampon 2");
     
            CharBuffer cb2 = tampon2.asCharBuffer();
     
            while (cb2.hasRemaining()) {
                 	System.out.print((char) cb2.get());
            }
     
     
        }
    }

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Oui mais... C'est complètement inutile de faire ça -_-°. Pourquoi aller chercher le fait que le système de codage des String de Java est proche de l'UTF-16BE ? Et que chaque lettre tient sur deux octets ?
    Alors que content.toCharArray() te donne directement le tableau de chars et que tu peux le wrapper dans un CharBuffer ?

    Dans le même genre, pourquoi utiliser un CharBuffer ? Qu'est-ce qui ne va pas avec un ByteBuffer tout simple rempli avec content.getBytes("ascii") ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Je crois qu'il avait juste envie de jouer avec les deux pour comprendre comment ça marche

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Justement, à moins de savoir ce que c'est que utf-16BE et pourquoi ça aide, s'en servir pour ces exemples me semble plutôt une preuve de confusion.
    À la limite, alterner entre octet nul et valeur ASCII du caractère, ça donnerait déjà une idée plus juste : chaque char est composé de deux octets, dont le premier est nul puisqu'aucun caractère ne dépasse 255...

    Enfin bon -_-°...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Tests
    Rebonjour, je teste simplement des méthodes relatives au tampon

    même si cela peut paraître non productif.

    Comme je l'ai dit d'entrée , ce sont des exercices et des essais, sans plus.

    Encore merci de votre attention.

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

Discussions similaires

  1. Utilisation de ByteBuffer
    Par titiyoyo dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 22/02/2010, 22h16
  2. Serialization d'objet dans un ByteBuffer
    Par ratakses dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 20/04/2007, 20h03
  3. Equivalent de ByteBuffer (Java) en C#
    Par vandamme dans le forum C#
    Réponses: 2
    Dernier message: 23/01/2007, 21h34
  4. Probleme Memoire avec Bytebuffer sosu eclipse
    Par jlassiramzy dans le forum Eclipse Java
    Réponses: 15
    Dernier message: 31/07/2006, 11h01
  5. Comment lire a partir d'un ByteBuffer avec java
    Par jlassiramzy dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2006, 15h36

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