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;
5 Réponses :
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. p>
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;
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.
Selon votre version Delphi:
d5-d2007 strong> p>
// strtoint ('$' + mystring); Oups, n'a pas lu la question très bonne ... p>
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;