Convertir un entier decimal en hexadecimal de la forme 0x1B

Signaler
Messages postés
19
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
21 juillet 2005
-
Messages postés
19
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
21 juillet 2005
-
Bonjour !



Voilà je developpe sous visual C++ et je voulais savoir s'il existait
une fonction ou si qq1 en avait dejà créee une qui permet de faire un
truc du genre :



je lui envoi un entier décimal 10 et elle me renvoi un entier hexa de la forme 0x0A par exemple ...







Merci d'avance

Slobberbone

9 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
itoa(nbr, buff, 16);

ciao...
BruNews, MVP VC++
Messages postés
19
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
21 juillet 2005

merci mais jai dejà essayer et ca ne fonctionne pas pour ce que je veux ....




Slobberbone
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007

Hello,



Alors essai



printf("0x%X",123); ou printf("0x%x",123);



et si tu mettre dans une chaîne



sprintf(buff,"0x%X",123); ou sprintf(buff,"0x%x",123);
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Pour formatter la chaine comme il veut ca serait plutot "0x%02x".
Messages postés
19
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
21 juillet 2005

Merci pour toute ces réponses, mais ce que je veux essayer de faire c
qu'à partir dun nombre décimal obtenir un nombre hexadécimal de la
forme 0x5A par exemple pour la valeur 90 !!



mais je veux garder le format int du debut jusqu'à la fin ...

pcq sprintf travaille avec des chaines de caractères ... et c pas
ce que je souhaite vu qu'il faut que je renvoi la valeur sur le port
série sous la forme 0x1B ...



pcq g essayé avec atoi() pour reconvertir le resultat de sprintf() mais ca ne donne rien ...



Merci beaucoup encore une fois !

Mais c pcq g peut -etre pas etais assez precis ...

Slobberbone
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007

Hello,


Dans un format int, il n'est pas question d'hexadécimal, de décimale... c'est tout de façon du BINAIRE, tu
peux pas avoir de l'hexa dans du int. C'est juste lors d'un affichage
que tu peux choisir le formattage ou dans une chaîne de caractère mais
pas dans un int.



Je pense que t'a qu'à renvoier ton int tel quel.
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
farpaitement, la valeur d'un nombre ne depend pas de la base dans laquelle il s'exprime !!!

seul son aspect quand tu l'affiches en depend.



il y a egalite entre 90 (base10) et 0x5A (base16). A l'écran ca n'est
pas pareil parce que ce meme nombre est exprimé dans deux bases non
identiques, mais sinon c'est le meme !!



d'ailleurs tu peux vérifier que 0x5A + 90 = 180 ... (printf("val : %d\n", 0x5A+90) )



il y a une petite confusion dans ton esprit ...

si sur ton port série tu envoies 0x5A ou 90, et que tu sniffes, dans
les 2 cas il va t'afficher 0x5A (s'il taffiche les choses en hexa)

en gros t'as rien a convertir !!!



a+
Messages postés
19
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
21 juillet 2005

vi mais le probleme (lol) c que je ve envoyer 0x2D et pas 45 !!! par exemple et crois moi qd je sniffe ca marche pas

et si j'envois 45 sur mon port com grace à writefile() il va m'envoyer 0x09 et 0x00 !!!! ( 90 en caractere !!!)



donc du coup g une autre fonction : writecomblock :



//---------------------------------------------------------------------------

// BOOL NEAR WriteCommBlock( HANDLE f, LPSTR lpByte , DWORD dwBytesToWrite)

//

// Description:

// Envoi un block sur le port COM

//

//---------------------------------------------------------------------------

BOOL NEAR WriteCommBlock( HANDLE f, LPSTR lpByte , DWORD dwBytesToWrite)

{



BOOL fWriteStat ;

DWORD dwBytesWritten ;

DWORD dwErrorFlags;

DWORD dwError;

DWORD dwLength;

COMSTAT ComStat;

char szBuff[150 ] ;

OVERLAPPED osWrite ;

LPSTR lpByteBis;

DWORD dwBytesToWriteBis;





if (f < 0)

return ( FALSE ) ;



dwError = ClearCommError( f, &dwErrorFlags, &ComStat ) ;

if (!dwError)

return(FALSE);

if(ComStat.cbInQue)

{

memset( &osWrite, 0, sizeof( OVERLAPPED ) ) ;

ClearCommError( f, &dwErrorFlags, &ComStat ) ;

do

{

dwLength = min( (DWORD) sizeof(szBuff), ComStat.cbInQue ) ;

ReadFile( f, szBuff, dwLength, &dwLength, &osWrite) ;

ComStat.cbInQue -= dwLength;

}while(ComStat.cbInQue>0);

}



memset( &osWrite, 0, sizeof( OVERLAPPED ) ) ;



fWriteStat = WriteFile( f, lpByte, dwBytesToWrite,



&dwBytesWritten, &osWrite ) ;



if (!fWriteStat)

{

dwError=GetLastError();

if(dwError == ERROR_IO_PENDING)

{

//il faut que getoverlappedresult soit egale a 0

//avant de recommencer writefile

while(!GetOverlappedResult( f,&osWrite, &dwBytesWritten, TRUE ))

{


if (dwBytesWritten && (dwBytesWritten <
dwBytesToWrite))


WriteFile( f, lpByte+dwBytesWritten,
dwBytesToWrite-dwBytesWritten,



&dwBytesWritten, &osWrite ) ;



dwError = GetLastError();

if(dwError == ERROR_IO_INCOMPLETE)

// normal result if not finished

continue;

else

{


// an error occurred, try to
recover


ClearCommError( f,
&dwErrorFlags, &ComStat ) ;

break;

}

}

memset( &osWrite, 0, sizeof( OVERLAPPED ) ) ;

ClearCommError( f, &dwErrorFlags, &ComStat ) ;


if ((dwBytesWritten>0) && (dwBytesWritten <
dwBytesToWrite))

{

// ici on doit emettre les octets qui manquent

lpByteBis=lpByte+dwBytesWritten;

dwBytesToWriteBis=dwBytesToWrite-dwBytesWritten;




fWriteStat=WriteFile( f, lpByte+dwBytesWritten,
dwBytesToWrite-dwBytesWritten,



&dwBytesWritten, &osWrite ) ;

if (!fWriteStat)

{

dwError=GetLastError();

if(dwError == ERROR_IO_PENDING)

{


while(!GetOverlappedResult( f,&osWrite,
&dwBytesWritten, TRUE ));

//traite 3eme bloc 1 bloc message 120 octets environ


fWriteStat=WriteFile( f, lpByteBis+dwBytesWritten,
dwBytesToWriteBis-dwBytesWritten,



&dwBytesWritten, &osWrite ) ;

dwError=GetLastError();

if(dwError == ERROR_IO_PENDING)


while(!GetOverlappedResult( f,&osWrite,
&dwBytesWritten, TRUE ));



//FIN

}



}

}

}

else

{



// some other error occurred





ClearCommError( f, &dwErrorFlags, &ComStat ) ;



return ( FALSE );

}

}

return ( TRUE ) ;



} // end of WriteCommBlock()





voilà et pour cette fonction j'envoi un entier 0x2D par exemple et g bien 0x2D qui est envoyer sur le port série !



donc c peut etre un peu confu ds mon esprit ( c mm sur lol! ) mais y a qd mm qqchose qui coince !!!!



merci


Slobberbone
Messages postés
19
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
21 juillet 2005

dsl ! tu avais raison cosmobob !!!



enfait, avec writefile ca marche pas mais aves writeblock oui !!



y a un moment des moments je suis vraiment space !!



enfin !



Merci a tous et puis au moins vous avez ma fonction writeblock qui soit
dit en passant permet d'envoyer tt ce qu'on veut sur le port série !!!!




Slobberbone