7
votes

Conversion des chaînes à hexagonale de manière performante

J'ai développé la fonction suivante pour convertir des chaînes en valeurs hexagonales.

function StrToHex(const S: String): String;
const
  HexDigits: array[0..15] of Char = '0123456789ABCDEF';
var
  I: Integer;
  P1: PChar;
  P2: PChar;
  B: Byte;
begin

  SetLength(Result, Length(S) * 2);
  P1 := @S[1];
  P2 := @Result[1];

  for I := 1 to Length(S) do
  begin
    B := Byte(P1^);
    P2^ := HexDigits[B shr 4];
    Inc(P2);
    P2^ := HexDigits[B and $F];
    Inc(P1);
    Inc(P2);
  end; 

end; 


0 commentaires

5 Réponses :


1
votes

Il semble suffisamment bon, vous pouvez toujours avoir une table de recherche d'octets -> 2 chiffres hexagoniques, mais que (et des optimisations similaires) me ressentent de la surkillée dans la plupart des cas.


0 commentaires

4
votes

Essayez celui-ci

   function String2Hex(const Buffer: Ansistring): string;
   var
     n: Integer;
   begin
     Result := '';
     for n := 1 to Length(Buffer) do
       Result := LowerCase(Result + IntToHex(Ord(Buffer[n]), 2));
   end;


4 commentaires

Super! Je viens de faire un test de performance et votre fonction est encore plus rapide (juste un peu) que la mienne. Merci!


À quelle fréquence avez-vous besoin de réduire-vous une chaîne jusqu'à ce que vous puissiez être sûr que cela a vraiment fonctionné?


@ ForLAN07, faites vos tests à nouveau. Le code de cet échantillon réaffecte résulte une fois pour chaque caractère dans "tampon", utilise InttoHex pour transformer des nombres en hex ... il ne peut pas être plus rapide! Votre code n'accepte que la mémoire une fois, puis un seul pour la boucle sur le texte pour le tourner tout en hexagonale.


@COSMIN Prund: Vous avez raison ... il semble que oui s'il y a un bug dans l'une de mes fonctions où je prends le temps. Je viens d'utiliser une fonction différente pour prendre le temps.



11
votes

Selon votre version Delphi:

d5-d2007 xxx

d2009 + < Pré> xxx


0 commentaires

0
votes

// strtoint ('$' + mystring); Oups, n'a pas lu la question très bonne ...


0 commentaires

3
votes

Je sais que c'est un très vieux sujet, mais je me sens un peu besoin de partager mon code concernant la question. Pendant des années, j'utilise mon propre hexencode, très similaire avec le code de Forlan, mais juste aujourd'hui, j'ai trouvé un moyen plus rapide de coder hexagonal. Avec mon ancien hexencode, encoder un fichier binaire de 180 Ko a pris environ 50 secondes, alors que cette fonction a pris 6 secondes.

function getHexEncode(txt : AnsiString) : AnsiString;
var
  a : integer ;
  st : TStringStream;
  buf : array [0..1] of AnsiChar;
  tmp : ShortString;
begin
  st := TStringStream.Create;
  st.Size := Length(txt)*2;
  st.Position := 0;
  for a:=1 to Length(txt) do
  begin
    tmp := IntToHex(Ord(txt[a]),2);
    buf[0] := tmp[1];
    buf[1] := tmp[2];
    st.Write(buf,2);
  end;
  st.Position := 0;
  Result := st.DataString;
  st.Free;
  //Result := '';  //my old code
  //for a:=1 to Length(txt) do Result := Result+IntToHex(Ord(txt[a]),2);  //my old code
end;


0 commentaires