J'ai trouvé ce code dans un programme plus ancien de Angus Johnson:
function CalcCRC32(p: PByte; length: NativeUInt): dword; var i: integer; begin result := $FFFFFFFF; for i := 0 to length-1 do begin result := (result shr 8) xor table[ pbyte(p)^ xor (result and $000000ff) ]; inc(p); end; result := not result; end; function HashLine(const line: string; IgnoreCase, IgnoreBlanks: boolean): pointer; var i, j, len: integer; s: String; begin s := line; if IgnoreBlanks then begin i := 1; j := 1; len := length(line); while i <= len do begin if not (line[i] in [#9,#32]) then begin s[j] := line[i]; inc(j); end; inc(i); end; setlength(s,j-1); end; if IgnoreCase then s := AnsiLowerCase(s); //return result as a pointer to save typecasting later... result := pointer(CalcCRC32(PByte(s), length(s))); end;
3 Réponses :
En général, ce code devrait fonctionner dans 64 bits, à condition que Le paramètre Aussi, vous devriez probablement changer Maintenant, avec qui dit, si vous souhaitez obtenir le CRC d'une chaîne de code code>, soyez conscient que code> chaîne code> est un longueur code> ne dépasse pas 2 Go. Ce n'est pas votre problème. P>
p code> doit être modifié à partir de
pCHAR code> à
pbyte code> (ou même juste
pointeur code>) depuis < Code> pchagr code> est
pwidechar code> dans d2009 + mais le code s'attend à ce que
pCHAR code> soit
Pansichar code>. P>
longueur code> à partir de
entier code> à
natif (u) Int code> afin que vous puissiez obtenir un meilleur avantage des tailles de mémoire 64 bits plus grandes que 2 Go. P>
uf-16 codé
unicodetring Code> dans D2009 +, mais CRC fonctionne sur octets em> plutôt que caractères em>. Ainsi, lors du calcul du CRC d'une chaîne code> code>, vous devez choisir le codage de l'octet qui doit être converti en premier. Et lors de la comparaison des CRC de plusieurs chaînes, assurez-vous qu'ils sont convertis dans le même octet codant en premier. p>
Le code ne fonctionne toujours pas. Il a été tiré de TextDiff \ basicdemo2 d'Angus Johnson: Angusj.com/delphi/textDiff.html a>
@ user1580348 Le code fonctionne bien. Vous ne prenez pas en compte Unicode correctement. Le code d'origine a été écrit pour une version Delphi prédée Unicode.
Merci Remy, je comprends cela maintenant. Comment le code de Angus Johnson pourrait-il être informé unicode?
Ne passez pas de texte à la fonction. Passer des octets, des données binaires. Commencez par le texte, encodez à l'aide de votre codage choisi, par exemple. UTF8, puis transmettez ces octets à la fonction CRC
Vous pouvez lire le pour mieux comprendre comment Ici, vous avez la section ici the l'appel chaîne code> fonctionne dans Delphi.
interface code> d'une fonction d'unicode
hachline code> fonction; Il n'y a aucune raison d'utiliser
pointeur code> comme type de résultat. p>
implémentation code> partie. P>
hashline ("bonjour, monde! ', false, false) code> résultats
f47b1828 code> qui est égal au résultat ici p> p>
Cela semble très intéressant et prometteur. Je vais le tester demain après avoir mis mon corps au repos.
Désolé d'être en retard, j'ai attrapé un lourd rhume, toujours affecté. Compris votre idée. Mais comment l'intégreriez-vous dans tout le projet i> TextDiff i>? Étant donné que procédure tform1.buildhashashlist code> in Unit1.pas par exemple s'attend à un paramètre code> Pointer code> et reçoit maintenant un
DWORD code>.
@ user1580348: cela peut être une nouvelle question, mais après Angus Johnson Dernier commentaire ... et une grande partie du code était (et est toujours) un désordre ... B> À votre question, vous pouvez prendre un autre approche du tout.
juste changer résultat: = pas résultat; code> à
résultat: = résultat XOR $ FFFFFFFF; P>. P>.
Ce n'est pas un problème de 32/64 bits. Ça va être un problème ANSI / Unicode
Vous ne montrez pas en code comment vous utilisez vos exemples.
Regardez dans la question modifiée.
Quelle est la définition de
s code>?
s est une chaîne ..
Mon commentaire reste toujours. Savez-vous comment votre texte est codé?
Vous pouvez télécharger le code source.
@ user1580348: si
s: = 'hello' code> puis
longueur (s) = 4 code> Mais il faut 8 octets et contient les valeurs suivantes: $ 48, $ 00, $ 65, $ 00, $ 65, $, $, 6c $ 00 $, 6C, $ 00, $ 6f, 00 $. Pour chaque personnage 2 octets. J'ai testé votre
CalcCrc32 (P: Pbyte; Longueur: NativeUint): DWORDINT): DWORD CODE> ON BERLIN 10.1 Update 2 et mes applications de console Win32 et Win64 renvoient la même valeur.
Veuillez télécharger le code source de Angus Johnson's Page.
Puisque vous n'avez pas répondu à ma question, je présume que vous ne connaissez pas encore des codages de texte. Cela paierait de se lire sur ce sujet.
Le code source de l'utilitaire TextDiff n'a jamais été censé être publié pour la même raison pour laquelle elle ne s'est pas comportée lorsqu'elle est compilée avec de vastes caractères et 64 bits et une grande partie du code était (et est toujours) un gâchis. Je ne sais pas comment vous avez eu la prise de cela comme généralement, je refuse des demandes de le libérer. Peut-être que je me suis relenu avec toi. Quoi qu'il en soit, je viens de revérifier mon site Web et je ne peux pas voir le code source là-bas.
Ahhh, je viens de voir le lien vers un très ancien fichier zip (mentionné et lié ci-dessus) que je n'ai pas réalisé était toujours en ligne. Oui, il contient 2 démos très basiques (pas l'utilitaire TextDiff). De toute façon, ils ont 10 ans et ne fonctionneront pas avec une compilation unicode ou 64 bits. Pardon.