Afficher une valeur Hexa ? [Résolu]

Messages postés
250
Date d'inscription
mardi 5 août 2003
Dernière intervention
15 juillet 2006
- - Dernière réponse : Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 5 juin 2006 à 00:49
Salut tout le monde.

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 -_-.

Comment faire s'il vous plaît ? :)

Merci d'avance...
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
Salut,

pour afficher une valeur Hexa dans un Caption rien de plus simple :
Button1.Caption :IntToHex( 10, 4);    // 000A Button1.Caption :IntToHex( $10, 4);  // 0010 Button1.Caption :IntToHex( 10, 2);    // 0A

@+
Cirec

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de f0xi
Messages postés
250
Date d'inscription
mardi 5 août 2003
Dernière intervention
15 juillet 2006
0
Merci
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...

Merci beaucoup ^^
Commenter la réponse de cs_Squallou
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
NON CIREC!

si c'est un entier scalaire (byte, integer, word ect...) :

button.caption := Format('$%.8x',[Ai]);
affiche : $00000000 a $FFFFFFFF

ou encore Format('0x%.8x',[Ai]);
affiche : 0x00000000 a 0xFFFFFFFF

ou encore Format('$%.2x $%.2x $%.2x',[a1,a2,a3]);
affiche : $00 $00 $00 a $FF $FF $FF

voir mon tuto sur format ... la fonction qui fait tout .. .sauf le café et encore pas sur...

surtout qu'elle permet de faire cela :

label1.caption := format('hexa : %0:.2x, Decimale : %0:.3d, Char : %1:s,[ord('A'),'A']);
affiche : hexa : 41, Decimale : 065, Char : A

et pouf ...
Commenter la réponse de f0xi
Messages postés
250
Date d'inscription
mardi 5 août 2003
Dernière intervention
15 juillet 2006
0
Merci
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 :)

Merci ^^
Commenter la réponse de cs_Squallou
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
Oui moi aussi j'aimerais avoir plus de précisions.


IntToHex n'est pas une erreur !!! non


Sinon a quoi servirait- elle






Extrait de l'aide de Delphi :








IntToHex
Routine

<descrshort id= "descrShort" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Renvoie la représentation hexadécimale d'un entier.
</descrshort>





Unité


<?XML:NAMESPACE PREFIX MSHelp NS "http://msdn.microsoft.com/mshelp" /?>
<mshelp:link keywords="SysUtils_Win32_Delphi" namespace="ms-help://borland.bds3" indexmoniker="!DefaultAssociativeIndex">SysUtils</mshelp:link>





Syntaxe





[Delphi] function IntToHex(Value: Integer, Digits: Integer): string;














[Delphi] function IntToHex(Value: Int64, Digits: Integer): string;














Description

<descrlong id ="descrLong" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<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














@+
Cirec
Commenter la réponse de Cirec
Messages postés
250
Date d'inscription
mardi 5 août 2003
Dernière intervention
15 juillet 2006
0
Merci
Ok c'est beaucoup plus clair.
Merci pour cette explication :)
Commenter la réponse de cs_Squallou
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
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;

et pif, paf, pouf ...

@+
Cirec
Commenter la réponse de Cirec
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
compare le code ASM a celui de format, tu verras qu'en fait, format regroupe toutes ces fonctions en une seule.

la ou elle est vraiment efficace c'est sur ce genre d'exemple :

S := 'bonjour : ' + inttostr(X) + inttostr(Y);

dés qu'il y a plus d'une convertion >> format!
Commenter la réponse de f0xi
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
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















@+
Cirec
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.