0
votes

CALCCRC32 pour des programmes 64 bits?

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;


12 commentaires

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 ?


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' puis longueur (s) = 4 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 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.


3 Réponses :


3
votes

En général, ce code devrait fonctionner dans 64 bits, à condition que longueur ne dépasse pas 2 Go. Ce n'est pas votre problème.

Le paramètre p doit être modifié à partir de pCHAR à pbyte (ou même juste pointeur ) depuis < Code> pchagr est pwidechar dans d2009 + mais le code s'attend à ce que pCHAR soit Pansichar .

Aussi, vous devriez probablement changer longueur à partir de entier à natif (u) Int afin que vous puissiez obtenir un meilleur avantage des tailles de mémoire 64 bits plus grandes que 2 Go.

Maintenant, avec qui dit, si vous souhaitez obtenir le CRC d'une chaîne de code , soyez conscient que chaîne est un uf-16 codé unicodetring dans D2009 +, mais CRC fonctionne sur octets plutôt que caractères . Ainsi, lors du calcul du CRC d'une chaîne , 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.



1
votes

Vous pouvez lire le pour mieux comprendre comment chaîne fonctionne dans Delphi.

Ici, vous avez la section interface d'une fonction d'unicode hachline fonction; Il n'y a aucune raison d'utiliser pointeur comme type de résultat. xxx

ici the implémentation partie. xxx

l'appel hashline ("bonjour, monde! ', false, false) résultats f47b1828 qui est égal au résultat ici


3 commentaires

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 TextDiff ? Étant donné que procédure tform1.buildhashashlist in Unit1.pas par exemple s'attend à un paramètre Pointer et reçoit maintenant un DWORD .


@ 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 ... À votre question, vous pouvez prendre un autre approche du tout.



0
votes

juste changer résultat: = pas résultat; à résultat: = résultat XOR $ FFFFFFFF; . .


0 commentaires