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 Delphi Discussion :

Valider sommairement une IP sans regex


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut Valider sommairement une IP sans regex
    Bonjour aux courageux qui ne sont pas en vacances,

    Je cherche un bout de code sommaire pour valider une saisie d'adresse IP dans InnoSetup.
    Avec une regex, c'est simple.

    Mais IS ne connait pas cet outil fabuleux.

    Quelqu'un aurait un truc (même à adapter) sous la main ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Papy214 Voir le message
    Bonjour aux courageux qui ne sont pas en vacances,
    pas encore mais ça se rapproche encore quelques heures à tenir
    Je cherche un bout de code sommaire pour valider une saisie d'adresse IP dans InnoSetup.
    Avec une regex, c'est simple.
    IP v4 ou V6 ?

    Pour IPv4 tu utilises une Stringlist avec séparateur
    puis tu vérifies le nombre d'éléments et chaque élément

    fait à la va vite
    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
    function TestIPV4(IP : String): Boolean;
    var SL : TStringList;
         S : String; 
    begin
     SL:=TStringlist.Create;
     result:=false; 
    try
     SL.Separator:='.';
     SL.DelimitedText:=IP;
     result:=SL.Count=4;
     if result then   
        for S in SL do
           Result:=Result AND (StrToIntDef(S,-1)>=0);   // on peut aussi vérifier que StrToIntDef(s,-1)<=255
    finally
      SL.Free;
    end; 
    End;
    par contre si pour l'ip v4 c'est simple , pour l'ip v6 trop de variantes sont possibles

    voilà ce que je viens de tester rapidement pour l'IP V6
    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
    function TestIPV6(IP : String): Boolean;
    var SL : TStringList;
         S,TS : String; 
    begin
     SL:=TStringlist.Create;
     result:=false; 
    try
     SL.Separator:=':';
     SL.DelimitedText:=ReplaceStr(IP,'::',':');
     result:=SL>0;
     if result then   
        for S in SL do
         begin
           if S.isEmpty then HS:='0'
                             else HS:='$'+S;
           Result:=Result AND (StrToIntDef(HS,-1)>=0); 
        end;  
    finally
      SL.Free;
    end; 
    End;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Courage pour les heures qui restent ...

    Pour le code, Inno Setup ne connait pas tout ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TStringList = class(TStrings)
      function Find(S: String; var Index: Integer): Boolean;
      procedure Sort;
      property Duplicates: TDuplicates; read write;
      property Sorted: Boolean; read write;
      property OnChange: TNotifyEvent; read write;
      property OnChanging: TNotifyEvent; read write;
    end;
    C'est léger ...

    Merci quand même ...
    Il me reste 1h00 pour trouver une solution. Si je trouve pas, ça attendra mon retour.
    Je vais fouiner un peu sur le net.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Re,

    InnoSetup

    Si c'est IPV4 tu découpes "à la main" la chaine c'est plus long mais à coup de pos, de len et de delete
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    j'ai trouvé une source sur le net: https://stackoverflow.com/questions/...o-setup-script

    J'ai testé rapidement, ça semble coller.

    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
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    //Validate an IPv4 address
    function ValidateIP(
      Input: String
      ): Boolean;
    var
      InputTemp : String;
      IP: Cardinal;
      i : Integer;
      Part: Integer;
      PartValue: Cardinal;
      PartValid: Boolean;
    begin
      InputTemp := Input;
      Result := True;
     
      Part := 3;
      PartValue := 0;
      PartValid := False;
      IP := 0;
      // When a '.' is encountered, the previous part is processed. Force processing
      // the last part by adding a '.' to the input.
      Input := Input + '.';
     
      for i := 1 to Length(Input) do
      begin
        // Check next character
        if Input[i] = '.' then
        begin
     
           if PartValue <= 255 then
           begin
             if PartValid then
             begin
               // A valid part is encountered. Put it in the result.
               IP := IP or (PartValue shl (Part * 8));
               // Stop processing if this is the last '.' we put in ourselves.
               if i = Length(Input) then
                 Break;
               // Else reset the temporary values.
               PartValid := False;
               PartValue := 0;
               Dec(Part);
             end
             else
               Result := False;
           end
           else
             Result := False;
     
        end
        else if ( (((Ord(Input[i]) - Ord('0'))) >= 0) and ((Ord(Input[i]) - Ord('0')) <= 9) ) then
        begin
          // A digit is found. Add it to the current part.
          PartValue := PartValue * 10 + Cardinal((Ord(Input[i]) - Ord('0')));
          PartValid := True;
        end
        else
        begin
          // Any other character 
         Result := False;
        end;
        // If part < 0, we processed too many dots.
        if Part < 0 then
          Result := False;
      end;
      // Check if we found enough parts.
      if Part > 0 then
        Result := False;
      // If Part is not valid after the loop, the input ended in a dot.
      if not PartValid then
        Result := False;
    end;

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    J'ai reçu un mail m'annonçant une autre solution mais le message n'apparait pas ici.
    J'ai réussi à récupérer la fonction dans le mail et je l'ai corrigée.

    Merci à celui qui a fait l'effort de cette tentative de passage du C à Pascal.

    Voici le code corrigé qui fonctionne au cas où ça puisse servir à d'autres.
    Le code est plus court que celui que j'ai trouvé sur le net.

    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
    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
     
    function address_extract_IP(IP_str: string): Boolean;
    var
      num: Cardinal;
      pos: Cardinal;
      verif: Cardinal;
      c: char;
      index: Byte;
      has_no_error: Boolean;
      need_continue: Boolean;
    begin
      pos           := 1;
      index         := 0;
      verif         := 65535; // 0xFFFF;
      num           := 0;
      has_no_error  := True;
      need_continue := True;
      while (has_no_error and need_continue) do
      begin
        c := IP_str[pos];
     
        if c = #0 then // <- End of string
          need_continue := False
        else
        begin
          if (c >= '0') and (c <= '9') then
          begin
            num   := num * 10 + Ord(c) - Ord('0');
            verif := num;
          end
          else if (c = '.') then
          begin
            if ((index < 3) and (verif <= 255)) then // <- 0x00FF
            begin
              Inc(index);
              num   := 0;
              verif := 65535; // 0xFFFF
            end
            else
              has_no_error := False;
          end
          else
            has_no_error := False;
        end;
     
        Inc(pos);
      end ;
     
      Result := (has_no_error and (index = 3) and (verif <= 255));
    end;

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    plus simplement il suffit de passer l'adresse à inet_addr et de tester que le résultat est <> INADDR_NONE
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    dans un script InnoSetup ??? ça va le faire ?

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    dans un script InnoSetup ??? ça va le faire ?
    je n'utilise pas InnoSetup, mais je suppose qu'il est capable d'appeler une fonction externe, non ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Apparemment, ça semble possible.
    Il faut juste que je trouve la déclaration correcte en external.

    Je cherche et je reviens avec le résultat.

    Merci

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    const
      WINSOCK_2_2 = 514;
      INADDR_NONE = $FFFFFFFF;
      WSASYS_STATUS_LEN = 128;
      WSADESCRIPTION_LEN = 256;
     
    type
      u_long = DWORD;
      #ifndef UNICODE
        AnsiString = string;
      #endif
     
      TWSAData = record
        wVersion: Word;
        wHighVersion: Word;
        szDescription: array[0..WSADESCRIPTION_LEN] of AnsiChar;
        szSystemStatus: array[0..WSASYS_STATUS_LEN] of AnsiChar;
        iMaxSockets: Word;
        iMaxUdpDg: Word;
        lpVendorInfo: PAnsiChar;
      end;
     
    function WSAStartup(wVersionRequested: Word; var lpWSAData: TWSAData): Integer;  external 'WSAStartup@ws2_32.dll stdcall';
    function WSACleanup: Integer;  external 'WSACleanup@ws2_32.dll stdcall';
    function inet_addr(cp: AnsiString): DWORD;  external 'inet_addr@ws2_32.dll stdcall';
     
    function IsValidIPv4(const Value: string): Boolean;
    var
      Data: TWSAData;
    begin
      Result := Value <> '';
      if Result then
      begin
        if WSAStartup(WINSOCK_2_2, Data) = 0 then
        begin
          Result := inet_addr(AnsiString(Value)) <> INADDR_NONE;
          WSACleanup;
        end
        else
          RaiseException('Winsock initialization failed!');
      end;
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    J'étais remonté dans Winapi.Winsock mais il me manquait le type exact de paramètre.
    ça fonctionne très bien avec ce code et les déclarations correspondantes.

    Merci anapurna

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

Discussions similaires

  1. Validation d'une chaine par Regex sous vb.net
    Par Lamanne dans le forum VB.NET
    Réponses: 10
    Dernier message: 27/03/2012, 07h58
  2. JDialog modale sans bouton avec validation depuis une Liste
    Par pcouas dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 21/01/2009, 08h33
  3. vider une table sans validation
    Par moulinmax dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/12/2008, 10h55
  4. fermeture d'une fenetre sans message de validation
    Par josémaria dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 09/11/2006, 10h03
  5. Réponses: 9
    Dernier message: 30/11/2005, 18h18

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