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 :

convertir tableau de byte en String


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut convertir tableau de byte en String
    Bonjour je suis nouveau sur le forum ( bien que je le consulte depuis 3 ans pour trouver des idées).

    Je suis sur un projet scolaire ( en master informatique).
    Mon problème est le suivant:
    1. j'ai une image sur le disque que je recupère en tableau de byte (fait)
    2. je veux maintenant transformer ce tableau de byte en tableau String , pour que plus tard je reprenne ce tableau de String et le convertis en tableau de byte afin de reconsituer l'image ( non fait)


    Ma première question est comment convertir un byte [] en String [] (je veux que ce String[] contienne ce qui s'affiche quand on affiche le contenu du byte[] via System.out.println() ).
    Ma seconde question est de savoir comment récuperer l'entete du fichier image via ce tableau de byte (entete qui contient la taille, le type, etc...)

    J'espère avoir été au maximum clair, sinon n'hesitez pas à me le faire savoir.

    Merci

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par geek21 Voir le message
    [*]je veux maintenant transformer ce tableau de byte en tableau String , pour que plus tard je reprenne ce tableau de String et le convertis en tableau de byte afin de reconsituer l'image ( non fait)
    Tu l'as en byte[] et quand tu voudras le récupérer tu le voudras en byte[]. Pourquoi tu veux passer par un String (ce qui d'ailleurs n'aurait aucun sens pour une image)?

  3. #3
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Salut

    Citation Envoyé par ®om Voir le message
    Tu l'as en byte[] et quand tu voudras le récupérer tu le voudras en byte[]. Pourquoi tu veux passer par un String (ce qui d'ailleurs n'aurait aucun sens pour une image)?
    Oui évidemment.

    Pour l'entete, tu peux le lire directement du fichier et n'arranger dans le tableau byte que les données utiles de l'image.
    L'entete differe d'un format a l'autre, par exmple pour un fichier bmp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    RandomAccessFile imgFile = new RandomAccessFile(imgName,"rw");
     
    String id = "" + (char)imgFile.readByte() + (char) imgFile.readByte();
    System.out.println("Identifier: " + id ); // doit afficher BM
     
    int fileSize = Integer.reverseBytes(imgFile.readInt());
     // car les 4 octets sont inversés dans le fichier.
    System.out.println("FileSize: " + fileSize);
     
    .......
    A toi de jouer.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par ®om Voir le message
    Tu l'as en byte[] et quand tu voudras le récupérer tu le voudras en byte[]. Pourquoi tu veux passer par un String (ce qui d'ailleurs n'aurait aucun sens pour une image)?
    En faite j'ai besoin de la passer en String afin de pouvoir coder manuelement le contenu du tableau de String (sauf l'entete que je souhaite isolée). Plus tard je decode ce tableau de String et le retransforme en tableau de byte.

    Donc ce que je cherche c'est comment passer du byte[] en String[] sans altérer le contenu du byte[].

    Amine_sas je vais m'empresser de tester cela.

    merci à vous

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    J'ai trouvé la solution pour mon premier problème.
    Je vous explique ce que j'ai fais pour que vous puissiez m'aider si possiblepour ma seconde question.
    Donc j'ai pris mon tableau byte[] TabByte (qui est rempli avec les bytes lus sur à partir d'une image). Par exemple l'affichage console de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i=0;i<TabByte.length;i++)
                System.out.print(TabByte[i]);
    me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -1-40-1-3201674707370011107207200-1
    Ensuite je prend TabByte et l'utilise de la façon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String [] ByteEnString=new String[TabByte.length]
    for(int i=0;i<TabByte.length;i++)
                    ByteEnString[i]=String.valueOf(TabByte[i]);
    J'obtiens ainsi la représentation en String de TabByte et l'affichage suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i=0;i<ByeEnString.length;i++)
                System.out.print(ByteEnString[i]);
    me donne exactement la même chose que le première affichage,c'est-à-dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -1-40-1-3201674707370011107207200-1
    Ma question maintenant est de savoir sur combien de byte l'entete de l'image est stocké (sur les 5 premiers? 10 premiers?).

    si quelqu'un maitrise les images en java....

  6. #6
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par geek21 Voir le message
    J'obtiens ainsi la représentation en String de TabByte et l'affichage suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i=0;i<ByeEnString.length;i++)
                System.out.print(ByteEnString[i]);
    me donne exactement la même chose que le première affichage,c'est-à-dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -1-40-1-3201674707370011107207200-1
    .
    Toujours difficile de trouver une raison pour cette conversion, (peut etre tu nous l'avouera).

    Ma question maintenant est de savoir sur combien de byte l'entete de l'image est stocké (sur les 5 premiers? 10 premiers?).

    si quelqu'un maitrise les images en java....
    ça depend énormement du type de l'image, ça differe entre BMP, Gif, JPG ...etc. Par exemple l'entete du format bmp contient entre autre:
    - Un idetifiant sur 2 octets.
    - La taille du fichier sur 4 octets.
    - Puis, 4 octets réservés.
    - Dataoffset (L'adresse du premier octet des données utiles dans le fichier) sur 4 octets .
    ....
    Cherches su google pour en apprendre davantage.

    @+

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Amine_sas
    Toujours difficile de trouver une raison pour cette conversion, (peut etre tu nous l'avouera).
    Je fais cette conversion car j'ai besoin de manipuler les bytes de l'image. Mais cette manipulation ne peut se faire que sur des String, c'est pour cela que je convertis le byte [] en String[]. La manipulation consiste à appliquer tout d'abord la Transformée de Burrows-Wheeler, et ensuite appliquer le Move To Front ( une explication est fournie ici et ici) qui sont des techniques de préparation pour la compression de l'image.

    Je ne vais utiliser que des JPEG pour mon projet, car le principe est le même du moment qu'on connait la taille de l'entete.
    C'est difficile de trouver de la doc la dessus j'ai cherché mais je n'ai rien trouvé de complet, seulement des approximations.

    Merci quand même.

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par geek21 Voir le message
    Mais cette manipulation ne peut se faire que sur des String
    Ah, on m'aurait menti !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte[] tab = { 12, 15, 27 };
    tab[0] = 13;
    Citation Envoyé par geek21 Voir le message
    c'est pour cela que je convertis le byte [] en String[].
    Mis à part que ça ne sert à rien, conceptuellement un String est un/manipule un byte[]. Donc un String[] c'est comme un byte[][]...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par ®om
    Ah, on m'aurait menti !

    Code :

    byte[] tab = { 12, 15, 27 };
    tab[0] = 13;

    Citation:
    Envoyé par geek21 Voir le message
    c'est pour cela que je convertis le byte [] en String[].
    Mis à part que ça ne sert à rien, conceptuellement un String est un/manipule un byte[]. Donc un String[] c'est comme un byte[][]...
    Mes fonctions MoveToFront et BurrowsWheeler s'appliquent à des String (c'est un choix personel), alors je prends la représentation en String des bytes pour utiliser ces fonctions sur une image. Où est le problème?

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par geek21 Voir le message
    Où est le problème?
    Le problème c'est qu'un String n'est pas fait pour stocker une image...
    Pourquoi ne pas utiliser int[] pour stocker des chaînes de caractères?

    Citation Envoyé par geek21 Voir le message
    Mes fonctions MoveToFront et BurrowsWheeler s'appliquent à des String (c'est un choix personel)
    Je serais toi, je reverrais mon choix personnel

    Bon courage.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par ®om
    Le problème c'est qu'un String n'est pas fait pour stocker une image...
    Pourquoi ne pas utiliser int[] pour stocker des chaînes de caractères?
    Je n'utilise pas un String pour stocker une image, je passe seulement par le String pour appliquer mes fonctions, ensuite je repasse le String[] en byte[].

    Citation Envoyé par ®om
    Je serais toi, je reverrais mon choix personnel
    Je suis mieux placé par rapport a mon sujet de projet pour savoir quel choix je dois faire (le même choix d'ailleur que l'ensemble de ma promotion). Après je peux te passer le sujet et tu peux refléchir à d'autres pistes (bien que je dirais que le sujet t'impose presque les choses)
    Personnelement si on était vraiment libre sur le sujet je n'aurais pas opté pour le passage par les String.
    ®om si tu as des info sur le nombre d'octet qu'occupe l'entete dans un fichier jpg je suis preneur, car je trouve rien de complet.

    Merci à vous

  12. #12
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Salut,

    Voir ce lien. Le tout est en anglais.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Merci Amine_sas. Sur ton liens j'ai trouvé une doc interessante et surtout complète sur les fichiers BMP. Je vais donc choisir ce type de fichier pour mon projet.

    Citation Envoyé par ®om
    Le problème c'est qu'un String n'est pas fait pour stocker une image...
    Pourquoi ne pas utiliser int[] pour stocker des chaînes de caractères?
    Qui a parlé de stocker une image dans un String? Tu n'as pas bien compris l'utilité du truc. De plus passer le fichier image sous forme de représentation en String est utile dans plusieur cas. En voila un

  14. #14
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Salut,
    Citation Envoyé par geek21 Voir le message
    De plus passer le fichier image sous forme de représentation en String est utile dans plusieur cas. En voila un
    Utilises donc la classe StringBuffer ou StringBuilder, elles sont plus rapide que String, notamment la derniere.

  15. #15
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    Salut,

    Je tiens à preciser Tu fais absolument ce que tu veux.

    Mais si j'ai bien compris ton problème, je serai plutot parti sur une representation de mon image par un tableau de int. Pour cela il y a les bufferedImage et avec eux il y a plus besion de prendre en compte le format de l'image (c'est le bufferedImage qui s'en occupe).

    De plus, il me semble qu'un byte a 255 valeurs soit 8 bits. Or une couleur en jpg est codé sur 4 bytes soit 32 bits.

    Si tu veux mettre les int de ton image en string voici comment je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BufferedImage bufferedImage;
    int tab[];
    String tabS[];
    try{
                bufferedImage = ImageIO.read(new File(fileName));
            }
            catch(IOException e){e.printStackTrace();}
    tab = new int[bufferedImage.getWidth()*bufferedImage.getHeight()];
    getRGB(0,0,bufferedImage.getWidth(),bufferedImage.getHeight(),tab,0,1);
    tabS = new String[tab.length()];
    for...
    tabS [] = new Integer(tab[]).toString();
    Il y a beauoup plus propre....
    J'espère que cela t'aidera...
    Bon courrage

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par philippe13 Voir le message
    Salut,

    Je tiens à preciser Tu fais absolument ce que tu veux.

    Mais si j'ai bien compris ton problème, je serai plutot parti sur une representation de mon image par un tableau de int.
    Bonjour philippe13,
    si je pouvais faire ce que je voulais j'aurais opté pour les BuferredImage comme tu l'as proposé, mais je suis obligé de passer par une représentation en String de l'image! C'est le sujet qui impose implicitement cela. Pour ce qui est de passer par des int pour arriver au String, et bien j'ai trouvé plus court, c'est-à-dire passer directement du byte[] en String[].
    Ce soir je poste le code que j'ai concu car je suis enfin arrivé à avoir ce que je voulais.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Donc voila ce que j'ai fait pour résoudre mon problème.

    Tout d'abord je récupère l'image BMP sur le disque dans un tableau de byte TabByte.
    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
     
            FileInputStream tmmp; /* Déclaration d'un FileInputStream */
            byte TabByte[] = new byte[(int)(ElementIni.length())]; /* Instanciation d'un tableau de byte de la taille du fichier */
            try
            {
                tmmp = new FileInputStream(ElementIni); /* Instanciation du FileInputStream sur le fichier */
                System.out.println(ElementIni.length() + " bytes dans le fichier d'entree");
                System.out.println(tmmp.read(TabByte) + " bytes lus dans le fichier"); /* Ecriture du contenu du fichier dans le tableau de bytes */
                System.out.println("Tableau cree");
     
            }
            catch(Exception e)
            {
                System.out.println("Tableau pas cree"); /* Bon, ben la ca a pas marché... */
                System.out.println(e.getMessage()); /* ... mais il dit quand meme pourquoi ... */
                TabByte = null;
            }
    J'extrais de TabByte les 54 premières cases qui representent l'entete de l'image (qui occupe les 54 premiers octets d'après ce que j'ai pu comprendre en m'informant sur la structure d'un fichier BMP,mais je ne suis pas encore certain). J'extrais aussi tout ce qu'il y a après les 54 premiers octets ( le reste représente donc les données proporement dites de l'image).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    byte [] entete= new byte [54];
    for(int i=0;i<54;i++){
         entete[i]=TabByte[i];
    }
     
    byte [] donnees= new byte [TabByte.length-54];
    for(int i=0;i<(donnees.length-54);i++){
         donnees[i]=TabByte[i+54];
    }
    Je mets de côté le tableau entete.

    Maintenant je prends la représentation en String du tableau de byte donnees, par exemple le byte -1835 deviendra la chaine "-1835". (là était mon problème).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String [] RepresentationEnChaine= new String[donnees.length];
    for(int i=0;i<donnees.length;i++){
          RepresentationEnChaine[i]=String.valueOf(donnees[i]);
    }

    Maintenant je peux appliquer mes fonctions BurrowsWheeler et MoveToFront à mon tableau de String RepresentationEnChaine (ces fonctions ne prennent en paramètre que des String, et je le redis QUE des String et ce n'est pas mon choix,d'où l'utilité d'avoir créer le tableau RepresentationEnString). Ces deux fonctions appliquent certains algorithmes pour coder et préparer l'image à la compression.

    Donc après avoir modifié RepresentationEnChaine, je reconvertis ce tableau de String en tableau de byte,par exemple RepresentationEnChaine[0] qui vaut "-4398" deviendra maintenant le byte -4398 (je fais l'opération inverse de tout à l'heure).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    byte [] ReconstitutionBinaire=new byte [RepresentationEnChaine.length];
    for(int i=0;i<RepresentationEnChaine.length;i++){
         ReconstitutionBinaire [i] = Byte.parseByte(RepresentationEnChaine[i]);
    }
    Enfin il ne manque plus qu'à assembler le tableau de byte entete de tout à l'heure avec ReconstitutionBinaire pour avoir un nouveau tableau de byte (que j'appelle TabByteFinal) contenant les bytes de l'image BMP de tout à l'heure, mais cette fois-ci dont le contenu a été modifié/codé (ou même crypté si l'on veut abuser du terme).
    Pour verifier que le contenu de l'image de depart diffère de celui de l'image final que l'on vient d'obtenir, il suffit de transformer TabByteFinal en fichier BMP en faisant comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            try
            {   
                // on spécifie le nom de fichier de sortie (qui va être creé par défaut dans le dossier du projet)
                FileOutputStream fileOut= new FileOutputStream("ImgModifiee.bmp");
                fileOut.write(TabByteFinal, 0, TabByteFinal.length);
            }
            catch (Exception e)
            {
                String err = e.toString();
                System.out.println(err);
            }
    Ce code a été testé entièrement et donc fonctionne correctement (moi j'ai inséré au milieu de ce code l'application de mes fonctions BurrowsWheeler et MoveToFront)

    Voila j'espère avoir été le plus clair et le plus précis possible et que cela servira à quelqu'un.

    Merci à tous

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

Discussions similaires

  1. [Débutant] Convertir un tableau de byte en string
    Par bipbip2006 dans le forum C#
    Réponses: 4
    Dernier message: 04/07/2011, 23h41
  2. Transformer un tableau de Byte en string
    Par kinouseb dans le forum Windows Forms
    Réponses: 3
    Dernier message: 13/01/2009, 18h09
  3. tableau de byte en String
    Par lerab51 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 22/05/2008, 11h12
  4. conversion d'un tableau de bytes en string
    Par prady92 dans le forum VB.NET
    Réponses: 3
    Dernier message: 16/03/2007, 14h47
  5. [debutant]Convertir un pointeur byte en String
    Par patmaba dans le forum SL & STL
    Réponses: 3
    Dernier message: 22/07/2005, 14h34

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