Convertir un entier decimal en hexadecimal de la forme 0x1B

cs_slobberbone Messages postés 19 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005 - 20 juil. 2005 à 16:08
cs_slobberbone Messages postés 19 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005 - 21 juil. 2005 à 11:20
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 juil. 2005 à 16:14
itoa(nbr, buff, 16);

ciao...
BruNews, MVP VC++
0
cs_slobberbone Messages postés 19 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005
20 juil. 2005 à 16:29
merci mais jai dejà essayer et ca ne fonctionne pas pour ce que je veux ....




Slobberbone
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
20 juil. 2005 à 16:33
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);
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
21 juil. 2005 à 02:03
Salut,

Pour formatter la chaine comme il veut ca serait plutot "0x%02x".
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_slobberbone Messages postés 19 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005
21 juil. 2005 à 09:40
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
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
21 juil. 2005 à 10:02
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.
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
21 juil. 2005 à 10:23
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+
0
cs_slobberbone Messages postés 19 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005
21 juil. 2005 à 10:42
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
0
cs_slobberbone Messages postés 19 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 21 juillet 2005
21 juil. 2005 à 11:20
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
0
Rejoignez-nous