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 :

Somme de bytes un par un


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut Somme de bytes un par un
    Bonjour,

    Je n'avais pas touché à Delphi depuis pas mal d'années, je suis donc pas mal rouillé et j'en viens à votre aide sur un bout de code dont je ne vois pas le bout depuis 2 jours...

    Je cherche à faire une fonction (qui prend 2 lignes en python...) en Delphi qui permet d'ouvrir un fichier, et d'avoir le total des octets additionnés un à un. Une sorte de checksum en fait.

    En gros, si j'ouvre le fichier en mode hexa... Je souhaite avoir le total de chaque octet additionnés les uns aux autres. (FF+A1+E8+FF...etc.)

    Voici ce que j'ai fait mais ça me retourne systématiquement un résultat nul.

    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
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      LFileStream: TFileStream;
      Buffer: array of byte;
      i: integer;
      Sum: byte;
     
    begin
      if OpenDialog1.filename='' then exit;
      LFileStream := TFileStream.Create(OpenDialog1.Filename, fmOpenRead);
      try
      LFileStream.Position := 0;
      SetLength(Buffer, LFileStream.Size);
      for i := 1 to length(Buffer) do
      begin
      Inc(Sum, Buffer[i]);
      end;
      finally
      LFileStream.Free;
      end;
     
      Memo1.Lines.Add('La somme des octets est : '+FloatToStr(Sum));
     
    end;
    Vos lumières sont les bienvenues...

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Atheus Voir le message
    Vos lumières sont les bienvenues...
    ma seule lumière serait ligne 10 je remplacerais if OpenDialog1.filename='' then exit;par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if OpenDialog1.execute then begin 
     // traitement
     end;
    ou par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not Opendialog1.execute then exit;
    , quoique je n'ai jamais essayé cette forme
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Merci pour la proposition
    Pour info ça ne fonctionne pas, ça exécute l'opendialog systématiquement.
    Pas grave, ce n'est pas à ce niveau que je pêche

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Atheus Voir le message
    Pour info ça ne fonctionne pas, ça exécute l'opendialog systématiquement.
    c'était le but, je ne savais pas que l'opendialog était exécuté avant.
    ce n'est pas à ce niveau que je pêche
    ben justement, comme ça, sans tester on (je) ne voit pas ce qui "pêche" donc, en gros, quel est le message d'erreur ?
    Quoique en y regardant de plus près Sum de type Byte
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    En fait avec ce bout de code, le résultat Sum est toujours = 0

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Pour moi, Sum devrait être un cardinal (quoique avec un gros fichier, if faudrait prévoir le débordement)
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Un tableau dynamique (array of) est toujours à base 0 => boucle de 0 à Size -1.
    Sum doit être initialisé à 0 avant la boucle. Sinon valeur indéterminée.

    Ensuite, ben... il faudrait peut-être remplir Buffer

    Sinon, passe par un TMemoryStream :
    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
    function FileSum(aFileName :TFileName) :integer;
    var
      i :integer;
      P :pByte;
     
    begin
      Result := 0;
     
      if not FileExists(aFileName) then exit;
     
      with TMemoryStream.Create do
      try
        LoadFromFile(aFilename);
        P := Memory;
     
        for i := 0 to Size -1 do
        begin
          inc(Result, P^);
          inc(P);
        end;
      finally
        Free;
      end;
    end;

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    J'ai essayé en cardinal ça me sort 0 aussi... Quel que soit le fichier testé...
    En fait quand je relis le code y'a rien qui me choque, mais ça ne semble pas être du tout la bonne méthode.

    (au delà de ça, gros plaisir de ressortir mon vieux Delphi 7)

    [Edit]Oups, je répondais au message précédent, merci je regarde ça

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Pas sûr que TMemoryStream.LoadFromFile existait déjà en D7...

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Je viens de tester ton code, ça a l'air de fonctionner, même avec D7 Je te remercie.
    Je vais quand m'assurer que c'est le même résultat qu'avec mon script en python

    A ce sujet, j'ai ressorti mon vieux Delphi 7, mais si on veut "jouer" tranquillement sans licence, y'a mieux aujourd'hui ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Sans licence non mais avec licence gratuite oui

    Delphi Community Edition.

    Tu dois t'enregistrer mais c'est gratuit et tu travailles avec la dernière version Starter à jour par rapport aux versions payantes.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup à vous 2.
    Je vais regarder ça...
    Je teste de façon plus approfondie le code ce soir (qui a l'air de vraiment bien fonctionner), et je passe la discussion en Résolue dans la foulée si OK.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    @andnotor
    Je viens de tester dans tous les sens, c'est parfait !
    D'un côté super content, de l'autre... Un peu morveux de ne pas avoir trouvé moi même...
    Ceci dit, vu que je n'étais pas du tout parti dans cette direction, je n'ai pas de regret.

    Par contre, pourrais-tu m'expliquer précisément ton code stp ? (histoire que je comprenne, voire que je m'appuie dessus pour le reste de mon programme)

    Si j'ai bien compris tu génères P comme tableau d'octets (array of bytes)
    Tu fais ensuite ta boucle qui incrémente chaque byte.

    Je n'ai pas compris par contre la présence de ton opérateur ^
    Idem la notion P := Memory; m'échappe...

    Enfin dernière question, dans mes étapes suivantes, puis-je récupérer des octets précis dans ton array ? (Genre les 6 derniers par exemple) puisque apparemment, il est déjà rempli


    Et encore merci pour ces lumières

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    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 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    memory c'est une propriété de la class tmemorystrem
    p est un pointer donc pour connaitre la valeur de p tu dois faire P^
    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

  15. #15
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    La propriété Memory du TMemoryStream est un pointeur sur la zone mémoire où est stockée le fichier lu. C'est donc une succession d'octets, et on peut sans souci affecter sa valeur à un pointeur sur octet (PByte).
    Un PByte pointe sur un octet, cad qu'il contient son adresse mémoire. Pour lire la donnée octet que pointe le PByte, on le déréférence par le signe ^. P^ représente donc l'octet pointé par P.
    Pour lire l'octet suivant, on décale le pointeur de la taille du type de donnée qu'il pointe : Inc(P) avance donc un pointeur d'une position dans une suite de données (qu'on peut voir comme un tableau).
    Il est tout à fait possible de récupérer une valeur dans une variable : MyByte := P^.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Merci vraiment à tous, j'ai appris pas mal de trucs... je vais continuer dans mon programme

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Je continue...
    Je ne connaissais pas TMemoryStream... Du coup j'ai un peu lu ici et là.

    Donc je reparts sur la base d'Andnotor afin de récupérer dans le Stream Mémoire, les octets qui m'intéressent, entre autre les 6 derniers du fichier.

    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
     
    var
      i : integer;
      P : pByte;
      N : pByte; // J'ai rajouté ceci
      Result : integer;
      Fin : integer; // Et ceci
     
    begin
      Result := 0;
      with TMemoryStream.Create do
      try
        LoadFromFile(OpenDialog1.Filename);
        P := Memory;
     
        for i := 0 to Size -1 do
        begin
          inc(Result, P^);
          inc(P);
         end;
     
    // Après la boucle, je lance ma recherche
        Seek(7, soFromEnd); // J'ai trouvé cette procédure qui m'a l'air pas mal.... Je démarre à 7 octets de la fin du fichier
        Fin := Read(N, 6); // Et je lis les 6 derniers octets
    finally
      Free;
      end;
     
    // Pour le test, on affiche le résultat :
      ShowMessage('Les deniers caractères sont  : '+FloatToStr(Fin));
    end;
    Là encore, résultat = 0
    Je serai bien reparti sur un TFileStream, mais le LoadFromFile a l'air bien aussi...

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Atheus Voir le message
    Je cherche à faire une fonction (qui prend 2 lignes en python...) en Delphi qui permet d'ouvrir un fichier, et d'avoir le total des octets additionnés un à un. Une sorte de checksum en fait.
    17 lignes tout compris, ça ira ?

    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
    procedure TForm7.Button1Click(Sender: TObject);
    var
      i :integer;
      sum : int64;
      LFileStream: TFileStream;
    begin
      if od.Execute then begin
        sum := 0;
        LFileStream := TFileStream.Create(od.Filename, fmOpenRead);
        with LFileStream do begin
          Position := 0;
          for i := 0 to Size -1 do sum := sum + ReadByte; // LE truc! ReadByte lit et avance tout seul : bonheur
          Free;
       end;
        ShowMessage(IntToStr(sum));
      end;
    end;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Aahahah, merci sympa
    Mais ReadBye... Mon "vieux D7" ne le connait pas !

    Apparemment ReadBye utilise System.IO, du framework .NET (d'après ce que je viens de lire)

    Tanpis pour tes 17 lignes

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Si je continue sur la lancée de @Aandnotor

    je garde mon TMemoryStream

    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
     
      var
      i : integer;
      P : pByte;
      Fin : integer;
     
      begin 
      with TMemoryStream.Create do
      try
        LoadFromFile(OpenDialog1.Filename);
        P := Memory;
        Seek(7, soFromEnd);
        Fin := Read(P, 6);
     
        // ... la boucle précédente
     
      finally
      Free;
      end;
      ShowMessage('Les derniers octets sont  : '+IntToStr(Fin))
    Avant la boucle pour la requête précédente, je peux utiliser la Mémoire remplie par les octets du fichier pour faire ma recherche ? Cette approche me donne toujours 0
    (et question subsidiaire, on peut écrire dans ce flux ?)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Somme des champs commencant par le même mot
    Par kemsy dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/10/2008, 18h47
  2. Somme de temps regroupés par nom
    Par Jonathan Raucy dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/08/2008, 08h39
  3. Somme de champs commençant par
    Par Jérémy VAUTIER dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 15/02/2008, 22h46
  4. Réponses: 9
    Dernier message: 04/01/2007, 11h58
  5. [Conception] Faire une somme de valeurs définies par une boucle
    Par fixbraun dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/09/2006, 23h46

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