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 :

string byte char 0


Sujet :

Langage Delphi

  1. #1
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut string byte char 0
    bonjour, je me décide à poster car je sais plus quoi faire

    comment découper une chaine string contenant des caractères #0 (null 0 je sais pas le debogueur delphi affiche #0 en byte c'est le 0

    j'interroge des serveurs diffèrent qui me renvoie tous un array de byte que je transforme en string avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function TranslateByteToString(bMsg: TIdBytes): String;
    Var
      I: Integer;
    Begin
      Result := '';
      For I := Low(bMsg) To High(bMsg) Do
        //on remplace les caractères 0 par saut de ligne linux sinon le string n'est pas affichable ni decoupable avec un tstringlist
        If bMsg[I] <> 0 Then
          Result := Result + Chr(bMsg[I])
        Else
          Result := Result + Chr(10);
    End;
    après je parse mon string selon le serveur, sauf qu'un serveur me renvoie en séparateur un caractère 0 que je remplace par des saut de ligne linux lors du passage de l'array de byte en string.

    sinon mon tmemo n'affiche pas les string contenant des #0
    et impossible d'exploser le string par le caractère zéro tout du moins j'ai pas trouvé d'ou ce post car je voudrai utiliser et renvoyer la réponse sans la modifier si possible...

    j'utilise sa qui fonctionne avec les sauts de ligne etc mais pas le caractères #0
    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
     
    Function Explode(Ch: String; Sep: String = ';'): TStringList;
    Var
      Pos: Integer;
    Begin
      Pos     := AnsiPos(Sep, Ch);
      Result := TStringList.Create;
      While Pos > 0 Do
      Begin
        Result.Add(Copy(Ch, 1, Pos - 1));
        If Pos <= Length(Ch) Then
          Ch := Copy(Ch, Pos + Length(Sep), Length(Ch));
        Pos := AnsiPos(Sep, Ch);
      End;
      If Length(Ch) > 0 Then
        Result.Add(Ch);
    End;CODE]
     
    ...
    Var
      Search: TStringList;
    Begin
          Search := Explode(FQueryResult, Chr(10));
          Try
    ...
          Finally
            Search.Free;
          End;
    je peut pas découper mon array de byte, obligé après sa conversion en string

    et j'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          LineResult.LineBreak := Chr(10);
          LineResult.Text      := FQueryResult;
    avec chr(0); sa va pas

    Delimiter et DelimitedText idem

    merci pour votre aide. Je sais pas si j'ai été bien clair je m'y perd moi même
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Cette procédure découpe une chaîne en fonction du séparateur défini, mais aussi des #0 .

    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
    procedure Explode(const aText :string; const aList :TStrings; const aSep :char = ';');
    var
      PStart :PChar;
      PEnd   :PChar;
      PSep   :PChar;
      Len    :integer;
     
    begin
      PStart := PChar(aText);
      PEnd   := PStart +Length(aText);
     
      while PStart < PEnd do
      begin
        PSep := AnsiStrScan(PStart, aSep);
     
        if Assigned(PSep)
        then Len := PSep -PStart
        else Len := StrLen(PStart);
     
        aList.Add(Copy(PStart, 1, Len));
        inc(PStart, Len +1);
      end;
    end;

  3. #3
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    tu as aussi la fonction ExtractStrings (je sais pas depuis quelle version elle existe, moi je suis en D7), qui fait un peu la meme chose.
    Sinon, pour parser ton TIdBytes, tu peux surement caster en pchar, avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure xxx(bMsg: TIdBytes; SL: TStrings);
    var
      i : integer;
      s: string;
    begin
      i := 0;
      while i <= High(bMsg) do
      begin
        s := PChar(@bMsg[i]);
        Inc(i, Length(s) + 1); //+1 pour le 0 terminal;
        SL.Add(s);
      end;
    end;

  4. #4
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    merci Andnotor j'ai utilisé ta méthode

    maintenant faut que je la modifie pour des séparateur allant jusqu'a 3 Char
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  5. #5
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    j'ai mis résolu trop vite je bloque encore désolé pour le double post

    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
    Procedure Explode(Const aText: String; Const aList: TStringList;
      Const aSep: Char = ';'; Const aSep1: Char = 'a'; Const aSep2: Char = 'a');
    Var
      PStart: PChar;
      PEnd:   PChar;
      PSep:   PChar;
      Len:    Integer;
    Begin
      PStart := PChar(aText);
      PEnd   := PStart + Length(aText);
      aList.Clear;
     
      While PStart < PEnd Do
      Begin
        PSep := AnsiStrScan(PStart, aSep);
     
        If Assigned(PSep) And
          ((aSep1 = 'a') Or (Copy(PStart, (PSep - PStart) + 1, 1) = aSep1)) And
          ((aSep2 = 'a') Or (Copy(PStart, (PSep - PStart) + 2, 1) = aSep2)) Then
        Begin
          Len := PSep - PStart;
        End
        Else
          Len := StrLen(PStart);
     
        aList.Add(Copy(PStart, 1, Len));
        Inc(PStart, Len + 1);
      End;
    End;
    FQueryResult:='xdcffbbbssdfftbbbsdffbdddbbeddd';
    Explode(FQueryResult, LineResult, 'b', 'b', 'b');
    sa me découpe bien en 3 lignes
    avec Explode(FQueryResult, LineResult, #0, #0, #0); sa fonctionne pas, avec un #0 oui mais pas plus
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Il faudrait avoir plus d'exemples des différents chaînes que tu reçois. Mais comme exposé, c'est Inc(PStart, Len +1) qui devrait être à +3. (Pour autant qu'il y ait aussi 3 #0)

    Tu peux aussi te passer de ces Copy dans tes tests:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if Assigned(PSep)               and
           ((PSep +1)^ in ['a', aSep1]) and
           ((PSep +2)^ in ['a', aSep2]) then...
    Maintenant, si il y a toujours les mêmes caractères comme séparateur, AnsiStrPos:

    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
    Procedure Explode(Const aText: String; Const aList: TStrings; Const aSep: string);
    Var
      PStart: PChar;
      PEnd:   PChar;
      PSep:   PChar;
      Len:    Integer;
    Begin
      PStart := PChar(aText);
      PEnd   := PStart + Length(aText);
      aList.Clear;
     
      While PStart < PEnd Do
      Begin
        PSep := AnsiStrPos(PStart, PChar(aSep));
     
        if Assigned(PSep)
        then Len := PSep -PStart
        else Len := StrLen(PStart);
     
        aList.Add(Copy(PStart, 1, Len));
        Inc(PStart, Len +Length(aSep));
      End;
    End;

  7. #7
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    je ne montrerai pas mes 32 lignes de code qui fonctionne pas...
    la je découpe comme sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          For Pos := 1 To Length(FQueryResult) Do
            If FQueryResult[Pos] = #0 Then
              FQueryResult[Pos] := #10;
     
          LineResult.LineBreak := #10#10#10;
          LineResult.Text := FQueryResult;
    ta fonction avec sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         FQueryResult:='te0st' + #0 + 'tte1sst' + #0#0#0 + 'tes2t' + #0 + 'tes3t';
         Explode(FQueryResult, LineResult, #0#0#0);
    renvoie 4 lignes au lieu de 2, du coup je remplace tout les #0 et je decoupe avec LineBreak niveau performance je ne sais pas ce que sa donne plutôt que découper directement...

    merci beaucoup
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

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

Discussions similaires

  1. Borland + sqlite (aducom) + string > 256 char = pas conte
    Par spyroux dans le forum C++Builder
    Réponses: 1
    Dernier message: 16/12/2005, 22h48
  2. Evaluation d'une variable string ou char* en C++
    Par Coelacanthe dans le forum SL & STL
    Réponses: 2
    Dernier message: 08/11/2005, 09h27
  3. [Array][String]byte[]
    Par beb-mbs dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 25/08/2005, 06h16
  4. Convertir String en Char: comment?
    Par nmathon dans le forum Langage
    Réponses: 2
    Dernier message: 22/08/2005, 20h58
  5. [Debutant(e)]limitation du String 65536 char
    Par srane dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 28/05/2004, 23h42

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