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

C# Discussion :

Optimisation de conversion ASCII à HEXA


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut Optimisation de conversion ASCII à HEXA
    Bonjour à tous,

    J'ai un problème et j'aimerais vos conseils pour trouver une solution.
    Comme c'est indiqué dans le titre je cherche à convertir un fichier qui est en ASCII ( avec des caractères nul et autres ) en Hexadécimal.

    En théorie je sais faire, avec un code comme cela ça marche:

    EDIT: Mon premier code ne fonctionné pas bien, je l'ai remplacé par celui là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string hex = "";
    foreach (char c in data)
    {
                hex += String.Format("{0:X}", Convert.ToUInt32(c)) + "  ";
    }
    Le problème c'est que mon fichier contient environ 8 millions de caractères... Du coup il me faut plusieurs minutes pour faire la conversions. C'est pas vraiment acceptable

    Est ce que quelqu'un aurait une idée pour optimiser le code et rendre cette exécution plus rapide ?

    NB: Je sais que ce n'est pas la seule méthode pour passer de l'ASCII à l'Hexa, j'en ai trouvé beaucoup sur internet mais c'est la même chose.

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Comme on ne connait pas le type de la variable data, ni la manière dont tu lis le fichier, il est difficile de donner une réponse.

    Accessoirement : quel est le besoin/but fonctionnel ici ?

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Comme on ne connait pas le type de la variable data, ni la manière dont tu lis le fichier, il est difficile de donner une réponse.

    Accessoirement : quel est le besoin/but fonctionnel ici ?
    Merci pour la réponse et désolé de n'avoir pas précisé tout cela.

    Pour ouvrir le fichier j'utilise un OpenFileDialog, pour permettre à l'utilisateur de choisir le fichier qu'il veut ouvrir.

    Je fais un .ReadToEnd() pour récupérer le contenu sous forme de string. Avec l'encodage Default je peux lire les caractères ASCII étendue.

    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
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
             Stream myStream = openFileDialog1.OpenFile();
             if (myStream != null)
             {
                        System.IO.StreamReader objReader;
                        objReader = new System.IO.StreamReader(openFileDialog1.OpenFile(), Encoding.Default);
     
                        string data = objReader.ReadToEnd();
     
                        //ASCII to Hexa
     
                       //Display
               }
    }
    Mon but est de récupérer tout les caractères d'un fichier dans un éditeur de texte, n'importe quel type d'encodage. Pour pouvoir les traiter ensuite.
    Il me semble difficile de traiter du code ASCII avec une table de 0 à 255.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    En effet, il semble que ta lecture soit la plus rapide que tu puisse effectuer.

    mais tu peux commencer par éliminer les instanciations et les conversions inutiles autant que répétitives et surtout les concaténations QUI NE DOIVENT JAMAIS ETRE UTILISEE en remplaçant ta boucle par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    StringBuilder hex = new StringBuilder();
    char[] chars = data.ToCharArray();
    			foreach (byte b in chars)
    			{
    				hex.AppendFormat("{0:x2} ", b);
    			}
    Ca devrait déjà aller un chouia plus vite (1000 fois environ ....).

    Mais je ne comprends toujours pas trop ce que tu compte faire de ta chaine en hexa.

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Tiens, je me suis amusé à reprendre ta conversion et la mienne et à mesurer les temps avec le petit bout de code suivant :

    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
    			string data = new string('z', 100000);
    			char[] chars = data.ToCharArray();
    			DateTime atime = DateTime.Now;
    			StringBuilder sbhex = new StringBuilder();
    			foreach (byte b in chars)
    			{
    				sbhex.AppendFormat("{0:x2} ", b);
    			}
    			DateTime btime = DateTime.Now;
    			string hex = "";
    			foreach (char c in data)
    			{
    				hex += String.Format("{0:X}", Convert.ToUInt32(c)) + "  ";
    			}
    			DateTime ctime = DateTime.Now;
    			Console.WriteLine("Temps 1 {0} ms - Temps 2 {1} ms", (btime - atime).TotalMilliseconds, (ctime - btime).TotalMilliseconds);
    Le résultat est sans appel :
    Temps 1 46,8714 ms - Temps 2 36997,1584 ms

    NE JAMAIS UTILISER LES CONCATENATIONS DE CHAINES !

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Merci pour l'astuce. C'est déjà mieux. Je vais essayer de partager le travail à faire en plusieurs thread pour aller encore plus vite.
    Je sens que ça va être du gros bidouillage.

    Ca devrait déjà aller un chouia plus vite; (il a été dit et répété que les concaténations de chaine vont 1000 fois plus lentement que l'usage des StringBuilder).
    C'est pour cela que j'ai essayé d'utiliser les StringBuilder dans un premier temps mais je pense que je n'avais pas bien saisi comment cela marché...

    Mais je ne comprends toujours pas trop ce que tu compte faire de ta chaine en hexa.
    Une fois que j'ai ma chaîne Hexa je compte en faire l'analyse pour faire apparaître différent message. Ce "parseur" utilise de l’hexadécimal en entrée.

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Maydey Voir le message
    Merci pour l'astuce. C'est déjà mieux. Je vais essayer de partager le travail à faire en plusieurs thread pour aller encore plus vite.
    Dans la mesure où tu ne peux pas "overlapper" grand chose ici (les threads n'auront pas vraiment d'états d'attente) je pense que tu ne vas pas gagner grand chose (tout dépend du nombre de core dont tu dispose).

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Maydey Voir le message
    Une fois que j'ai ma chaîne Hexa je compte en faire l'analyse pour faire apparaître différent message. Ce "parseur" utilise de l’hexadécimal en entrée.
    Il vaudrait mieux convertir ton hexa en char ou en byte (si tu es en ASCII et pas en UTF-8 autant travailer en byte) et parser ensuite sur la chaine elle même ce serait beaucoup, beaucoup plus rapide.

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Il vaudrait mieux convertir ton hexa en char ou en byte (si tu es en ASCII et pas en UTF-8 autant travailer en byte) et parser ensuite sur la chaine elle même ce serait beaucoup, beaucoup plus rapide.
    Encore merci pour ces conseils, je vais voir comment je peux faire ça.


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

Discussions similaires

  1. Conversion ASCII / Hexa
    Par franchouze dans le forum Tcl/Tk
    Réponses: 4
    Dernier message: 12/07/2007, 17h23
  2. conversion ascii hexa
    Par sofiane61 dans le forum C
    Réponses: 4
    Dernier message: 16/08/2006, 09h28
  3. Conversion ascii=> hexa=>binaire
    Par grunk dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 18h45
  4. CONVERSION ASCII => HEXA
    Par tatarifa dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 05/11/2005, 15h12
  5. conversion : (Ascii en hexa) => nombre
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 21/04/2004, 14h44

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