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

 Delphi Discussion :

Trier Des Adresses IP Par Port ?


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut Trier Des Adresses IP Par Port ?
    Bonsoir à tous,

    J'ai encore une fois besoin de votre aide :

    J'ai une ListBox dont les Items ressemblent à ça (Y est un chiffre) : YYYYYYYYY:YYYY
    Exactement pareil q'une adresses IP suivi de son port.

    Ce que je cherche à faire c'est extraire certains Items dont le port est par exemple :1234 et les placer dans un second ListBox.

    Pour le moment je n'ai pas trop d'idées sur comment procéder...
    La première chose qui me vient à l'idée serait d’utiliser une expression régulière (comme TPerlRegEx).

    Quelqu'un aurait-il une idée ou une piste ?

    Merci par avance !

    Beny

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu peux rechercher la position des : et prendre la partie qui suit ou qui précède, selon que ce que tu veux récupérer (le port ou l'ip).

    Regarde la méthode Pos et Copy

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par ero-sennin Voir le message
    Salut,

    Tu peux rechercher la position des : et prendre la partie qui suit ou qui précède, selon que ce que tu veux récupérer (le port ou l'ip).

    Regarde la méthode Pos et Copy
    Merci pour l'idée, je ne connaissais pas, je vais regarder de ce côté là.

    Je viens d'essayer avec une expression régulière asse simple du type TPrelRegEx.RegEx := '(.{5,50}\:1234)'; et ça fonctionne parfaitement mais le code est assez lourd à répéter...

    Je tiens ce topic au courant de mes recherches
    Si d'autres ont des idées, n'hésitez pas.

    Beny

  4. #4
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    En effet, la méthode de ero est la plus efficace, je pense.
    Un simple Pos(':1234',Str) te renverra une valeur différente de 0 si le port de ton addresse est 1234 ...

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 730
    Points : 25 637
    Points
    25 637
    Par défaut
    ExtractStrings le fera très bien aussi

    Tu peux aussi trouver de nombreuses version de Explode et Split sur le forum

    TStringList, DelimitedText, Delimiter peuvent aussi servir !
    C'est dingue de chercher dans les expressions régulières et ne pas utiliser ce qui existe depuis D3 !

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 843
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 843
    Points : 13 615
    Points
    13 615
    Par défaut
    Sinon, une simple comparaison mémoire

    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
    procedure ExtractPort(aSource, aDest :TStrings; aPort :string = ':1234');
    var
      p :PChar;
      i :integer;
    begin
      aDest.Clear;
     
      for i := 0 to aSource.Count -1 do
      begin
        p := PChar(aSource[i]);
        inc(p, Length(aSource[i]) -Length(aPort));
     
        if CompareMem(p, PChar(aPort), Length(aPort) *SizeOf(Char)) then
          aDest.Add(aSource[i]);
      end;
    end;

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    TStringList peut aussi être utilisé pour stocker des keys/values. Voir NameValueSeparator et ValueFromIndex.

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut
    Merci pour vos réponses !

    Pour le moment j'utilise une expression régulière :
    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
     
      ListString3 := Form1.ListBox1.Items.Text;
      PR3 := TPerlRegEx.Create;
      PR3.Options := PR3.Options + [preCaseLess];
      PR3.Subject := ListString3;
      for Index := 0 to Form5.ListBox2.Items.Count - 1 do
      begin
      try
        PR3.RegEx := '(.{5,20}\:'+Form5.ListBox2.Items.Strings[Index]+')\b';
        PR3.Compile;
        if PR3.Match then
        begin
            CurrentItem := Form5.ListBox2.Items.Strings[Index];
            Form5.ListBox3.Items.Add(PR3.MatchedText);
            while PR3.MatchAgain do Form5.ListBox3.Items.Add(PR3.MatchedText);
              Form5.GroupBox1.Caption := 'Process : ('+IntToStr(Form5.ListBox3.Items.Count)+')';
              Application.ProcessMessages;
          end;
      finally
      end;
      end;
    Ça fonctionne très bien mais c'est vrai que je préférerai un méthode plus rapide.
    Je vais essayer la procédure ExtractPort de Andnotor

    Beny

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Pas testé, mais pourquoi faire compliqué ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      i1: integer;
    begin
      ListBox1.Items.NameValueSeparator := ':';
      for i1 := 0 to ListBox1.Items.Count - 1 do begin
        if ListBox1.Items.ValueFromIndex[i1] = '1234' then begin
          // Ajouter élément courant à ListBox2
        end;
      end;
    end;

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Pas testé, mais pourquoi faire compliqué ???

    Hmmm, pas mal !
    Je vais voir si ça vaut le coup de modifier toute ma procédure.

    Beny

Discussions similaires

  1. Comparer et trier des adresses Internet
    Par rambc dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 15/03/2009, 19h44
  2. tracage d'adresse IP par port ouvert
    Par anouarsurvive dans le forum Développement
    Réponses: 1
    Dernier message: 15/03/2009, 16h46
  3. trier des mois bdd par date complete
    Par Djwaves dans le forum IHM
    Réponses: 3
    Dernier message: 05/11/2008, 13h02
  4. Trier des adresses IP
    Par blacksnake dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 16/06/2007, 12h54

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