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 manipulation de chaines (en C# ou LUA)


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Geek en formation
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Geek en formation

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Optimisation manipulation de chaines (en C# ou LUA)
    Bonjour.

    Voila, j'ai un petit soucis d'optimisation. Afin de communiquer proprement avec un device, j'ai besoin de lui envoyer un commande avec parametres variables. Le souci etant qu'il y a 2 bytes pour lesquels je dois faire un remplacement (exemple remplacer "AB" par "AB AC" (les espaces sont juste la pour faciliter la lecture)
    A la base j'ai commence a faire ca en script sous LUA me disant que ca serait rapide. Malheureusement, si je fais un bete string.gsub, il ira me les remplacer sans fair attention (exemple il remplace "9A B5" par "9 AB AC 5" ce qui me casse completement ma commande.
    J'ai donc commence par ajouter des espaces entre chaque byte puis fait ma recherche tranquillement. Mais du fait que ma commande est longue, ca prends pas mal de temps.
    Pour feinter j'ai cree un dll C# qui fait la meme chose et il s'avere que ca marche un peu plus vite. Mais c'est toujours pas ca. Genre existe-t-il une commande C# optimisee pour ajouter des espaces ou encore mieux une commande replace qui fait automatiquement la separation entre les bytes?
    Ou si quelqu'un s'y connait aussi en LUA je suis pret a voir (en fait ma dll C# est appelee par LUA donc j'imagine que si quelque chose existe la dessus ca serait surement plus rapide).

    Je sais pas si j'ai ete super clair, hesitez pas a me demander si vous voulez des precisions.

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Pour ce type de manipulation de chaine en C# on utilise la classe StringBuilder.

    Pour recopier de long tableau de byte j'utilise BlockCopy
    Maintenant dans ton cas c'est peut etre inutile.

    Dans le pire des cas tu vas te retrouver avec un tableau de byte deux fois plus grand.
    L'idée est donc de créer un tableau deux fois plus grand, de copier les byte un à un, en faisant l'insertion si nécessaire. Et enfin si nécessaire de recopier le tableau utile dans un tableau de la taille minimal (avec la methode BlockCopy). Cette dernière etape n'est peu etre pas obligatoire dans ton cas.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Geek en formation
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Geek en formation

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Thanks,.
    Je vais regarder ca de plus pres

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Je comprends pas trop...

    Vous parlez de chaînes et de bytes.

    Vu que c'est pas la même chose, vous cherchez quoi au juste ?

    Dans une chaîne de caractère, remplacer les caractères dont la valeur en byte est "AB" (c'est à dire 171) par "ABAC" (c'est à dire 171 suivit de 172) ou si vous avez les deux caractères "AB" que vous voulez remplacer par "ABAC" lorsque sa position dans la chaîne est un nombre pair ?

    En effet, c'est pas trop la même chose !

    Pour le second cas (pas question de byte) voici ce que je vous propose :
    Code c# : 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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace Plop
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("AZERTYABUIOP");
                Console.WriteLine("AZ ER TY AB UI OP");
                Console.WriteLine(QuickReplaceAB("AZERTYABUIOP"));
     
                Console.WriteLine("AZERTYUABIOP");
                Console.WriteLine("AZ ER TY UA BI OP");
                Console.WriteLine(QuickReplaceAB("AZERTYUABIOP"));
     
                Console.ReadKey(true);
            }
     
            private static string QuickReplaceAB(string str)
            {
                StringBuilder sb = new StringBuilder();
     
                int oldpos = 0;
                int newpos = 0;
                while (str.IndexOf("AB", oldpos) > 0)
                {
                    newpos = str.IndexOf("AB", oldpos);
     
                    if (newpos % 2 == 0)
                    {
                        sb.Append(str.Substring(oldpos, newpos));
                        sb.Append("ABAC");
                        oldpos = newpos + 2;
                    }
                    else
                    {
                        sb.Append(str.Substring(oldpos, newpos + 1));
                        oldpos = newpos + 1;
                    }
                }
                sb.Append(str.Substring(oldpos));
                return sb.ToString();
            }
        }
    }

Discussions similaires

  1. Manipulation de chaines
    Par tchoukapi dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 04/09/2006, 17h41
  2. [D7] Manipulations de chaines
    Par jer64 dans le forum Delphi
    Réponses: 2
    Dernier message: 21/07/2006, 22h16
  3. [PLSQL] Manipulation des chaines.
    Par zero d dans le forum Oracle
    Réponses: 5
    Dernier message: 14/12/2005, 18h27
  4. Réponses: 4
    Dernier message: 20/08/2004, 10h59
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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