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 :

(SearchBinaryInFile) : Copier un string dans un TByteDynArray


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut (SearchBinaryInFile) : Copier un string dans un TByteDynArray
    Bonjour à tous

    La fonction SearchBinaryInFile me pose un problème de syntaxe tout bête. La chaîne de caractère (string) à rechercher dans le fichier : comment la copier dans un TByteDynArray ?

    Rien ne passe : ni StrCopy(), ni := , ni quoi que ce soit. Comment faire cette copie d'un string ds un TByteDynArray (donc un tableau de bytes, si je comprends bien) ?

    Illustration :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Var passées en paramètres à SerchBinary -------
     
    Nom_F_SearchBinary : string;   // F où effectuer la recherche
    Tab_Chn_Rech : TByteDynArray;   // Tableau de Bytes à chercher dans le fichier
    Tab_Positions : TInt64DynArray;  // Tableau d'Int64 qui contiendra les positions des occurrences trouvés
    Rech_Ttes_Occurrences : boolean;  // Si True,  remplit le tableau Tab_Positions des différentes occurrences
    Max_Occurrences_Acceptees : integer; // Si le nombre d'occurrences trouvées atteint ce nombre, la recherche s'arrête
    Accepter_Chevauchement_Occurrences : boolean;   // (exemple : on cherche coco; si le fichier contient cocococo : True = 3, False = 2)
    Nb_Occurrences_Trouvees : integer;  // retourné par la fonction
    La fonction est explicitée ici , mais je bloque :/ : http://www.developpez.net/forums/d78...e/#post4542214

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Voici ce que je fais, mais "Erreur d'étendue" à l'exécution :

    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 Copier_String_Sur_DynArray;  // DEBUG
    Var   i : integer;
          Car_Pointe : char;
     
    begin
     
          For i := 1 to (Longueur_Chn -1) DO
              begin
                    Car_Pointe := Chn_Recherchee[1];
                    Tab_Chn_Rech[i] := Byte(Car_Pointe);
              end;
     
    end;

  3. #3
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Sous Delphi < 2009, ou avec des AnsiString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function StringToByteArray(const S: AnsiString): TByteDynArray;
    var
      Len: Integer;
    begin
      Len := Length(S);
      SetLength(Result, Len);
      Move(S[1], Result[0], Len);
    end;
    Sous Delphi >= 2009, les chaînes sont Unicode. Donc il faut savoir dans quel encodage tu veux transformer ta chaîne avant de rechercher la chaîne de bytes dans le fichier. Puis tu as la méthode GetBytes de TEncoding.

    Donc si tu veux travailler en UTF-8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bytes := TEncoding.UTF8.GetBytes(S);
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Sous Delphi < 2009, ou avec des AnsiString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function StringToByteArray(const S: AnsiString): TByteDynArray;
    var
      Len: Integer;
    begin
      Len := Length(S);
      SetLength(Result, Len);
      Move(S[1], Result[0], Len);
    end;
    Sous Delphi >= 2009, les chaînes sont Unicode. Donc il faut savoir dans quel encodage tu veux transformer ta chaîne avant de rechercher la chaîne de bytes dans le fichier. Puis tu as la méthode GetBytes de TEncoding.

    Donc si tu veux travailler en UTF-8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bytes := TEncoding.UTF8.GetBytes(S);
    Ca, c'est une piste ! Merci Je vais tester ça tout de suite.

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Sous Delphi < 2009, ou avec des AnsiString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function StringToByteArray(const S: AnsiString): TByteDynArray;
    var
      Len: Integer;
    begin
      Len := Length(S);
      SetLength(Result, Len);
      Move(S[1], Result[0], Len);
    end;
    Sous Delphi >= 2009, les chaînes sont Unicode. Donc il faut savoir dans quel encodage tu veux transformer ta chaîne avant de rechercher la chaîne de bytes dans le fichier. Puis tu as la méthode GetBytes de TEncoding.

    Donc si tu veux travailler en UTF-8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bytes := TEncoding.UTF8.GetBytes(S);
    OK. Ca marche (je suis en D7) :je peux appeler SearchBinaryToFile(), avec ta fonction

    En revanche, c'est SearchBinary elle-même qui semble foirer. Elle ne trouve systématiquement pas les chaînes de caractères que je lui passe. Aléatoirement oui, ou non . Tests effectués sur fichiers HTM et RTF . Pr les fichiers RTF, Delphi a ce qu'il faut : FindText(). Mais pour les HTM, HTML etc, là, FindText() s'égare...

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Sinon, il y a le code de SearchStringInFile juste en dessous de SearchBinaryInFile dans le lien que tu as cité comment chercher une valeur hex dans un fichier binaire "file of byte"

    de D4 à D2007, cela fonctione sans soucis
    Après D2009, il faudra passer à AnsiString et AnsiChar dans le Code

    Et donc, la fonctionne trouve pas le mot que tu recherches, cela m'intéresse, je pourrais peut-être t'aider

    Attention, c'est une recherche binaire pur !
    si tu cherche "toto" dans un HTML, cela ne trouve que "toto" mais pas "t<B>ot<\B>o"
    Je fais cette remarque parce FindText lui cherche du Texte dans un RTF en retirant les balises de mise en forme
    Evidemment FindText ne traitant que du RTF, cela ne peut pas traiter du HTML
    Et vouloir utiliser FindText sur du HTML c'est que tu n'as pas compris l'aide et
    que tu ne mesures par l'importance des balises de mise en forme et de la différence entre un fichier texte simple et un fichier plus évolué !

    Avec TWebBrowser.Naviagate2(FichierLocal), puis OleDoc->Body->InnerHTML puis une fonction Pos, tu peux bidouiller un extracteur de Text de fichier HTML
    c'est un peu moche !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, il y a le code de SearchStringInFile juste en dessous de SearchBinaryInFile dans le lien que tu as cité comment chercher une valeur hex dans un fichier binaire "file of byte"

    de D4 à D2007, cela fonctione sans soucis
    Après D2009, il faudra passer à AnsiString et AnsiChar dans le Code

    Et donc, la fonctionne trouve pas le mot que tu recherches, cela m'intéresse, je pourrais peut-être t'aider

    Attention, c'est une recherche binaire pur !
    si tu cherche "toto" dans un HTML, cela ne trouve que "toto" mais pas "t<B>ot<\B>o"
    Je fais cette remarque parce FindText lui cherche du Texte dans un RTF en retirant les balises de mise en forme
    Evidemment FindText ne traitant que du RTF, cela ne peut pas traiter du HTML
    Et vouloir utiliser FindText sur du HTML c'est que tu n'as pas compris l'aide et
    que tu ne mesures par l'importance des balises de mise en forme et de la différence entre un fichier texte simple et un fichier plus évolué !

    Avec TWebBrowser.Naviagate2(FichierLocal), puis OleDoc->Body->InnerHTML puis une fonction Pos, tu peux bidouiller un extracteur de Text de fichier HTML
    c'est un peu moche !
    C'est toi l'auteur de cette fonction, non ? Elle est super... mais je dois lui passer de mauvais paramètres. Je te mets le code en ligne, attends

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon, il y a le code de SearchStringInFile juste en dessous de SearchBinaryInFile dans le lien que tu as cité comment chercher une valeur hex dans un fichier binaire "file of byte"

    de D4 à D2007, cela fonctione sans soucis
    Après D2009, il faudra passer à AnsiString et AnsiChar dans le Code

    Et donc, la fonctionne trouve pas le mot que tu recherches, cela m'intéresse, je pourrais peut-être t'aider

    Attention, c'est une recherche binaire pur !
    si tu cherche "toto" dans un HTML, cela ne trouve que "toto" mais pas "t<B>ot<\B>o"
    Je fais cette remarque parce FindText lui cherche du Texte dans un RTF en retirant les balises de mise en forme
    Evidemment FindText ne traitant que du RTF, cela ne peut pas traiter du HTML
    Et vouloir utiliser FindText sur du HTML c'est que tu n'as pas compris l'aide et
    que tu ne mesures par l'importance des balises de mise en forme et de la différence entre un fichier texte simple et un fichier plus évolué !

    Avec TWebBrowser.Naviagate2(FichierLocal), puis OleDoc->Body->InnerHTML puis une fonction Pos, tu peux bidouiller un extracteur de Text de fichier HTML
    c'est un peu moche !

    Ca maaaaaarche !!! Fantastique !!

    Dis-donc, ShaiLeTroll, on ne t'a jamais dit que tu avais du génie, toi ?

Discussions similaires

  1. copier un tableau string dans une arraylist
    Par ouadie99 dans le forum C#
    Réponses: 2
    Dernier message: 18/03/2008, 12h50
  2. Copier un String dans un variant
    Par foued_scorpion dans le forum Visual C++
    Réponses: 2
    Dernier message: 03/11/2006, 23h35
  3. [TP] Copier une variable string dans le presse-papier
    Par astyan dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 04/08/2006, 22h47
  4. Réponses: 6
    Dernier message: 24/07/2003, 12h39

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