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 :

Obtenir le CRC32 d'une chaîne


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Points : 34
    Points
    34
    Par défaut Obtenir le CRC32 d'une chaîne
    Bonjour,

    Je cherche à obtenir le CRC32 d'une chaine.
    J'ai trouvé quelques exemples mais aucun ne me donne le résultat attendu.
    Par exemple pour ABC le résultat hexadécimal devrait être A3830348.

    Auriez-vous un bout de code à partager ?

    Merci

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Points : 34
    Points
    34
    Par défaut
    Je pense avoir trouvé mon bonheur ici : http://www.efg2.com/Lab/Mathematics/...Initialization

    En fait non ! Lorsque je recompile l'appli les valeurs changent
    Je bosse sur Delphi XE5...

    Une idée de ce qui pourrait influencer ces différences après recompli ?

    Merci

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 42
    Points : 34
    Points
    34
    Par défaut
    Un cast de la chaine en AnsiString et ça marche
    Désolé pour le monologue

  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
    Bonjour
    Citation Envoyé par Tillt Voir le message
    Désolé pour le monologue
    Pas de soucis, cela m'arrive souvent. Une certaine constante fait que, une fois la question posée sur le forum, on trouve la réponse avant que quelqu'un nous la souffle. A mon avis, la raison en est que en posant par écrit le problème il devient généralement plus clair et que, bien concentré dessus, contrairement à ceux qui pourrait nous lire et ne sont pas dans notre tête, l'acharnement paye

    Ceci étant pour le CRC32, ne m'en étant jamais servi, je suis étonné qu'il n'y ait aucune fonction standard fournie quelque-part (au pire dans la JCL http://wiki.delphi-jedi.org/wiki/JCL...thRoutines.CRC)
    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 habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut Oui mais comment?
    Citation Envoyé par Tillt Voir le message
    Un cast de la chaine en AnsiString et ça marche
    Désolé pour le monologue
    Bonjour,
    Ceci m'intéresse, mais comment "caster" une chaine string en AnsiString?
    Moi, j'obtiens la même chose
    Je dois obtenir pour une chaine (p.ex 6b121130376928 25.88 3.68)
    un CRC32 de 9CBD0E4C
    Merci pour votre aide

  6. #6
    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 445
    Points
    28 445
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      us: string;
      as: AnsiString;
    begin  
      us := 'Chaîne unicode';
      as := AnsiString(us); // et voilà !
    end;
    voir aussi http://lookinside.free.fr/delphi.php...ns+les+strings
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Sinon TEncoding.GetBytes pour travailler sur les octets est plus logique pour calculer un CRC32
    Si l'on connait un peu la mémoire, on sait que S[1] c'est le premier char et que PByte(@PChar[1]) pointe sur le premier octet donc peut utiliser la suite comme un pointeur (voir un tableau)

    Non parce que la réponse de Paul Toth est juste mais c'est un peu le B.A-BA, la syntaxe élémentaire du Transtypage
    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

  8. #8
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      us: string;
      as: AnsiString;
    begin  
      us := 'Chaîne unicode';
      as := AnsiString(us); // et voilà !
    end;
    voir aussi http://lookinside.free.fr/delphi.php...ns+les+strings
    Bonjour,
    Malheureusement non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var 
    chaine : string;
    RecalcCRC: AnsiString;
    implementation
    ...
    chaine:= trim(copy(memo1.Lines[j],21,26)); // contient 6b121130376928 25.88 3.68
    RecalcCRC:=AnsiString(chaine); // RecalcCRC contient toujours 6b121130376928 25.88 3.68 :-(
    Aussi AnsiString n'apparait pas en bleu dans l'éditeur Delphi XE2?!?
    ... une idée?
    Merci

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pourquoi continuez dans ce sujet déjà résolu vieux de 4 ans ?

    Evidemment que si chaine contient "6b121130376928 25.88 3.68" il y aura la même chose dans RecalcCRC d'un point de vue de l'interprétation respectivement des charset Unicode et ANSI (Windows 1252 en France)

    la différence est au niveau binaire, dans chaine le nombre d'octet est double, il y aura d'ailleurs beaucoup de 00 car c'est que du ANSI

    Il n'y a même pas de fonction de CRC32 dans votre code, c'est hors sujet !


    string est un mot clé donc en couleur comme begin end - couleur "mot réservé"
    AnsiString, UTF8String, UnicodeString, WideString sont des types comme Integer, Word ... cela reste en noir couleur "identificateur

    C'est une coloration du forum qui inclue les types en couleur mais pas celle de Delphi



    Ah copy(chaine, 21, 26) c'est prend 26 caractères à partir du 21ème
    Ne pas croire que cela copie du caractère 21 au 26 inclus soit seulement 6 caractères ... au cas où je précise
    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

  10. #10
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Merci ;-)
    oui 26 caractères comme écrit plus haut: 6b121130376928 25.88 3.68

    ... et le trim permet d'éliminer le caractère blanc vu que la chaine 6b121130376928 varie en longueur selon les cas de 14 à 15 caractères ;-)

  11. #11
    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 445
    Points
    28 445
    Par défaut
    et donc en résumé, voici ce que ça donne...et ça donne bien 9CBD0E4C

    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
     
    uses
      System.ZLib;
     
    function CRC32Str(const Str: string): string;
    var
      crc: UInt32;
      bytes: TBytes;
    begin
      crc := CRC32(0, nil, 0);
      bytes := TEncoding.ANSI.GetBytes(Str);
      crc := CRC32(crc, PByte(bytes), Length(bytes));
      Result := IntToHex(crc, 8);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ShowMessage(CRC32Str('6b121130376928 25.88 3.68'));
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    et donc en résumé, voici ce que ça donne...et ça donne bien 9CBD0E4C

    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
     
    uses
      System.ZLib;
     
    function CRC32Str(const Str: string): string;
    var
      crc: UInt32;
      bytes: TBytes;
    begin
      crc := CRC32(0, nil, 0);
      bytes := TEncoding.ANSI.GetBytes(Str);
      crc := CRC32(crc, PByte(bytes), Length(bytes));
      Result := IntToHex(crc, 8);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ShowMessage(CRC32Str('6b121130376928 25.88 3.68'));
    end;
    De fait, c'est parfait
    Merci 1000x Monsieur Toth
    Vous méritez largement le titre d'expert éminent
    Meilleures salutations,
    PhilLu

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Au final, pas de transtypage mais comme je l'avais mentionné un TEncoding.GetBytes, je n'avais compris qu'il fallait qu'on fournisse le code au lieu d'expliquer le pourquoi du comment
    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

  14. #14
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Au final, pas de transtypage mais comme je l'avais mentionné un TEncoding.GetBytes, je n'avais compris qu'il fallait qu'on fournisse le code au lieu d'expliquer le pourquoi du comment
    au départ je répondais à "mais comment "caster" une chaine string en AnsiString?"...mais comme je reviens de congés je suis de bon humeur alors j'ai donné la solution
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Calculer le CRC32 d'une chaine de caractère
    Par bumbolol dans le forum Caml
    Réponses: 11
    Dernier message: 11/04/2010, 13h31
  2. Comment obtenir une chaine avec Date/heure ?
    Par Flow_75 dans le forum VBA Word
    Réponses: 4
    Dernier message: 05/05/2008, 16h18
  3. Obtenir une chaine d'internationalisation ?
    Par TSalm dans le forum Struts 1
    Réponses: 7
    Dernier message: 04/04/2007, 08h52
  4. obtenir JComponent a partir d'une chaine
    Par Zorgz dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 01/11/2006, 15h28
  5. [md5] obtenir une chaine de caractère
    Par FFF dans le forum Sécurité
    Réponses: 1
    Dernier message: 27/10/2005, 23h08

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