Je suis débutant (nan sans blague ? -_-) et je cherche à faire un truc tout bêbête : convertir une valeur Hexa en chaîne de caractères (pour l'utiliser dans une propriété Caption par exemple).
Pour les numériques je fais : Button.Caption := IntToStr(53);
Mais pour les Hexa ? HexToStr n'existe pas -_-.
ouai mais IntToHex c'est comme BinToHex et HexToBin ... elles ont des perf mediocre ...
je pense qu'il vaut mieux apprendre a se servir de Format (dispo en c++) car elle est beaucoup mieux.
y'a juste un cas ou format n'est pas bonne a utilisée :
format('%s %s %s',['bonjour','ça','vas ?']);
mieux vaux utiliser : 'bonjour'+'ça'+'vas ?';
y'a juste pour ça qu'elle n'est pas bonne, la concatenation de chaine ... tout comme la fonction Concat (voir aide delphi).
mais pour le reste elle est carrement mieux que XToStr.
et puis c'est normal, format convertis tout en un seul coups et en assembleur en plus.
donc dans le cas de convertion d'une seule valeur ... IntToStr ou FloatToStr ou Format peuvent etre utilisées.
dans les convertions multiple (dans la meme chaine) mieux vaux n'utiliser que format.
Ha oui en effet Oo
J'avais vu cette routine mais je pensais que le type renvoyé ne serait pas chaîne de caractères et donc pas affichable directement...
heuuu IntToHex marche bien non ? Dans quel(s) cas ça va pas ?
Sinon la méthode du Format me plait bien aussi.
J'ai lu ton tuto (que j'avais déjà survolé) et en effet c'est super pratique. Surtout que d'après toi les performances sont meilleures, ce qui est très intéressant pour ce que j'essaie de faire :)
<routine namespace="SysUtils">
IntToHex
</routine> convertit un nombre en une chaîne contenant la représentation hexadécimale (base 16) de ce nombre. Valeur est le nombre à convertir. Digits indique le nombre minimum de chiffres hexadécimaux à renvoyer.
Effectivement Format est plus rapide et en plus elle fait tout (sauf le café)
</descrlong>
Mais pour une simple convertion le résultat est le même non
C'est donc bien ce que je pensais,
C'est pas faut et le résultat est idem.
Et pour la vitesse ben regarde ça :
function IntToHex(Value: Integer; Digits: Integer): string;
// FmtStr(Result, '%.*x', [Digits, Value]);
asm
CMP EDX, 32 // Digits < buffer length?
JBE @A1
XOR EDX, EDX
@A1: PUSH ESI
MOV ESI, ESP
SUB ESP, 32
PUSH ECX // result ptr MOV ECX, 16 // base 16 EDX Digits field width
CALL CvtInt
MOV EDX, ESI
POP EAX // result ptr
CALL System.@LStrFromPCharLen
ADD ESP, 32
POP ESI
end;
donc sur une grosse boucle il se peut même que IntToHex soit plus rapide puisqu'elle est spécialement faite pour et en ASM
Voilà donc l'argument ne tiens plus
et re-pouf ...
Et même IntToStr est en ASM :
function IntToStr(Value: Integer): string;
// FmtStr(Result, '%d', [Value]);
asm
PUSH ESI
MOV ESI, ESP
SUB ESP, 16
XOR ECX, ECX // base: 0 for signed decimal
PUSH EDX // result ptr
XOR EDX, EDX // zero filled field width: 0 for no leading zeros
CALL CvtInt
MOV EDX, ESI
POP EAX // result ptr
CALL System.@LStrFromPCharLen
ADD ESP, 16
POP ESI
end;
OUI F0XI!
ça je le sais déjà mais pour en revenir à l'exemple qui nous interresse IntToHex fait tout aussi bien l'affaire que Format (dans ce cas de figure)
Voilà donc le "NON CIREC!" était peut être un peut trop fort non