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 :

Convertir du binaire en String ASCII


Sujet :

Langage Java

  1. #1
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut Convertir du binaire en String ASCII
    Bonjour,

    Je doit convertir du binaire (byte[]) en string ASCII. J'ai déjà fait une fonction (qui marche ) mais je me demandais s'il n'y aurait pas plus élégant en termes de vitesse. Je ne connais pas toute l'API Java (loin s'en faut)

    Mon 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 String toAscii(byte[] Value)
    	{
    		if( (Value == null) || (Value.length == 0) )
    			return "";
     
    		// translate byte[] into string
    		StringBuilder buf = new StringBuilder();
    		for(int boucle = 0; boucle != Value.length; boucle++)
    		{
    			byte carac = Value[boucle];
    			buf.append(String.format("%02x", carac & 0xff));
     
    		}
    		return buf.toString();
    	}
    Est ce qu'il y a mieux (je suis sûr que oui)

    Merci de vos retours
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Edit : nope, le code ci-contre n'est pas du tout ce qui est demandé. String s = new String(value, StandardCharsets.US_ASCII);

    Par contre, ça fera un NullPointerExcepion si value est null.

    Quelques remarques de style :

    - ta méthode aurait dû s'appeler fromAscii() edit : bon bah toHexa(), plutôt.
    - Seuls les noms de classe devraient commencer par une majuscule. (Et les noms de constantes, puisqu'ils devraient être entièrement en majsucules.) Le paramètre Value devrait donc être value.
    - et en fait, value ça veut pas dire grand-chose. Plutôt un nom comme bytes, qui indique que ce sont les octets que l'on veut convertir en String. Edit : finalement, ça se discute.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Par contre, ça fera un NullPointerExcepion si value est null.
    Le cas Value est null ou Value est vide est géré en début de fonction

    Citation Envoyé par thelvin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = new String(value, StandardCharsets.US_ASCII);
    Tu es sûr (ou alors on ne s'est pas compris) ?

    Mes données en entrée sont du binaire pur (en fait le contenu d'une image PNG) que je doit transporter dans du XML d'où la transformation binaire ==> ASCII
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Le cas Value est null ou Value est vide est géré en début de fonction
    Je parle du code que je te montre. Le tien accepte un tableau null. Le mien, non.

    Citation Envoyé par ram-0000 Voir le message
    Citation Envoyé par thelvin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = new String(value, StandardCharsets.US_ASCII);
    Tu es sûr (ou alors on ne s'est pas compris) ?
    Edit : yup, je me suis planté, j'ai pas les yeux en face des trous. Désolé.

    je suis sûr que mon code fait la même chose que le tient.

    Edit : ou pas, quand on le copie/colle.
    Désolé.
    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
    Ou la non les codes sont pas les même et la demande est très mal formulée. Ce que tu veux c'est transformer le binaire en un string qui ne contient que des charactères ascii pour des raisons de transmission, et qui pourra, par la suite être retransformée en binaire de l'autre coté. Ta question départ était plutot formulée du genre j'ai lu un fichier ascii avec inputStream, j'ai maintenant un tableau de byte, comment récupérer la String qui était dans le fichier



    Ce que tu cherche au final, c'est de l'encodage en base64 pour rester standard. Et là le plus simple, c'est de passer par une api dédiée, comme commons codec, qui fournis un encodeur décodeur en base 64:


    http://commons.apache.org/proper/com...ry/Base64.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    byte[] test = ....
    String resultat =  Base64.encodeBase64String(test);
    byte[] retourALaNormale =  String	decodeBase64(resultat);
    // test et retourALaNormale contiennent maintenant les mêmes valeurs


    PS: si tu veux vraiment partir sur l'hexadecimal comme tu as commencé avec ton code (mais qui aboutit à des chaînes plus longues), il y a la classe Hex dans la même librairie, avec des appels similaires:

    http://commons.apache.org/proper/com...inary/Hex.html

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Bon bah effectivement si je prenais la peine de copier/coller avant de parler je dirais moins d'âneries -_-°.

    tchize_ a indiqué le B.-A.-BA, je ne pense pas qu'il y ait autre chose à ajouter.
    En principe, il serait un peu plus performant de faire soi-même la conversion byte -> 2 chiffres hexa que de le faire avec String.format(). D'où l'intérêt de commons-codec Hex si on tient à utiliser l'hexa.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Sinon concernant ton code initial il est plutôt propre.

    J'aurais juste 3 remarques :
    • La paramètre "Value" devrait se nommer "value"
    • On peut déterminer à l'avance la taille de la chaine finale, et donc initialiser le StringBuilder à la bonne taille (pour éviter les redimensionnements auto)
    • Utilises le for-étendus pour parcourir le tableau


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public String toAscii(byte[] value) {
    		if (value == null || value.length == 0)
    			return "";
     
    		StringBuilder buf = new StringBuilder(value.length*2);
    		for (byte carac : value) {
    			buf.append(String.format("%02x", carac & 0xff));
    		}
    		return buf.toString();
    	}

    a++

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    OK, ce sera donc du base64 encoding d'autant plus qu'Android possède déjà une classe base64 toute faite.

    En fait, je préfère aussi le base64 parce que l'encodage généré est plus court que de la solution sur laquelle j'étais parti.

    La cible finale c'est bien pour Android mais comme c'est aussi du Java...

    Je trouverais bien un moyen de décoder le Base64 sous Qt (sur plateforme PC), c'est assez "standard" comme encodage mais cela, c'est une autre histoire.

    Merci à tous
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Sinon concernant ton code initial il est plutôt propre.
    Merci !

    Citation Envoyé par adiGuba Voir le message
    [*] La paramètre "Value" devrait se nommer "value"
    J'en prends bonne note

    Citation Envoyé par adiGuba Voir le message
    [*] On peut déterminer à l'avance la taille de la chaine finale, et donc initialiser le StringBuilder à la bonne taille (pour éviter les redimensionnements auto)
    C'est vrai, bonne optimisation

    Citation Envoyé par adiGuba Voir le message
    [*] Utilises le for-étendus pour parcourir le tableau[/list]
    Heu ... quand on débute (et je suis un débutant Java), on reste sur les bases (d'autant plus que je ne suis pas persuadé qu'un for étendu aille plus vite que le for que j'avais fait).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  10. #10
    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
    Citation Envoyé par ram-0000 Voir le message
    La cible finale c'est bien pour Android mais comme c'est aussi du Java...

    Je trouverais bien un moyen de décoder le Base64 sous Qt (sur plateforme PC), c'est assez "standard" comme encodage mais cela, c'est une autre histoire.

    Merci à tous
    Ha ben, je comprends maintenant, je me demandait depuis quelques semaines pourquoi tu venait te perdre de notre coté du forum

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Heu ... quand on débute (et je suis un débutant Java), on reste sur les bases (d'autant plus que je ne suis pas persuadé qu'un for étendu aille plus vite que le for que j'avais fait).
    Il irait plus vite à taper en tout cas. Ce n'est pas une question de rapidité mais de clarté du code, tout comme Value qui devrait commencer par une minuscule.

    Le for-étendu peut parfois mener à du code plus rapide (par exemple, quand on parcourt une List, qui pourrait être une LinkedList très longue, et que sans for étendu on l'aurait parcourue avec get() plutôt qu'avec iterator().) Du coup c'est une bonne idée d'en prendre le réflexe. Mais en général, c'est pas pour ça qu'on en parle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    C'est vrai, bonne optimisation
    C'est juste du détail, qui ne se fera sentir que sur de très grosse chaine de caractère.
    L'important c'est surtout d'utiliser StringBuilder et de ne pas faire de concaténation de String...


    Citation Envoyé par ram-0000 Voir le message
    Heu ... quand on débute (et je suis un débutant Java), on reste sur les bases (d'autant plus que je ne suis pas persuadé qu'un for étendu aille plus vite que le for que j'avais fait).
    C'est juste que le for-étendus est plus lisible, et donc plus pratique !

    Quand à l'optimisation je pense que le compilateur et la JVM ont tout ce qu'il faut pour optimiser cela comme il faut




    a++

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

Discussions similaires

  1. Comment convertir de l'hexadecimale au string ASCII ?
    Par Battosaiii dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 17/03/2006, 19h04
  2. Convertir du binaire en Ascii
    Par brute dans le forum MFC
    Réponses: 2
    Dernier message: 28/12/2005, 09h20
  3. Réponses: 14
    Dernier message: 29/06/2005, 10h22
  4. [String][ASCII]Java / Python
    Par chrdou dans le forum Général Java
    Réponses: 8
    Dernier message: 18/02/2005, 14h35
  5. [C#] Convertir des bytes en string
    Par sorcer1 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/02/2005, 15h52

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