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
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
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
Un cast de la chaine en AnsiString et ça marche
Désolé pour le monologue
Bonjour
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)
voir aussi http://lookinside.free.fr/delphi.php...ns+les+strings
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;
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
Bonjour,
Malheureusement non
Aussi AnsiString n'apparait pas en bleu dans l'éditeur Delphi XE2?!?
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 :-(
... une idée?
Merci
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
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 ;-)
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;
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager