Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fonction pour convertir un int en valeur hexa

10 réponses
Avatar
Chat
Bonjour,
je souhaire convertir un int en val. hexa, comment peut on faire ça sans
utiliser "0x__" ?
thanks

10 réponses

Avatar
Marc Boyer
In article <40460acf$0$28124$, Chat wrote:
Bonjour,
je souhaire convertir un int en val. hexa, comment peut on faire ça sans
utiliser "0x__" ?


Tu veux dire *afficher* un int en hexa ? %x ?

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Pierre Maurette
"Chat" a écrit ...
Bonjour,
je souhaire convertir un int en val. hexa, comment peut on faire ça sans
utiliser "0x__" ?
thanks
Que souhaitez-vous faire exactement?

En C, une "val. hexa" est soit une chaîne de caractère, soit une façon
d'écrire un constante numérique. Dans le premier cas, sprintf() pour obtenir
la chaîne. Dans le second, 0x.... pour saisir directement une valeur en
l'exprimant en hexadécimal.
Troisième hypothèse, on vous a demandé à l'école d'écrire un IntToHex().
Pierre

Avatar
Chat
Pierre Maurette wrote:
"Chat" a écrit ...

Bonjour,
je souhaire convertir un int en val. hexa, comment peut on faire ça sans
utiliser "0x__" ?
thanks


Que souhaitez-vous faire exactement?
En C, une "val. hexa" est soit une chaîne de caractère, soit une façon
d'écrire un constante numérique. Dans le premier cas, sprintf() pour obtenir
la chaîne. Dans le second, 0x.... pour saisir directement une valeur en
l'exprimant en hexadécimal.
Troisième hypothèse, on vous a demandé à l'école d'écrire un IntToHex().
Pierre


mon cas correspond au second que vous decrivez, je veux utiliser une

valeur hexa pour envoyer une commande sur le port serie.
Le pb c que la valeur a envoyer en utilisant 0x__ est un char qui est
recuperé par une fonction native java, donc pour resumer,
j'ai une fonction qui dans son proto a unsigned char , et je dois lui
balancer qq chose du style 0x__ et de l'autre coté j'ai un char.
donc je voudrais faire une sorte de concatenation 0x+monChar
ou transformer ce char en val hexa.
je sais pas si je suis clair.


Avatar
Antoine Leca
Chat va escriure:
je souhaire convertir un int en val. hexa, comment peut on faire ça
sans utiliser "0x__" ?


sprintf( "%x"


(cela devrait être dans la FAQ, selon mes souvenirs de clc)

Antoine

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Chat wrote:

je souhaire convertir un int en val. hexa, comment peut on faire ça sans
utiliser "0x__" ?


Cette question n'est pas claire. Un 'int' a une représentation interne
binaire. Que veux-tu faire exactement?

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Chat wrote:

je veux utiliser une
valeur hexa pour envoyer une commande sur le port serie.
Le pb c que la valeur a envoyer en utilisant 0x__ est un char qui est
recuperé par une fonction native java, donc pour resumer,
j'ai une fonction qui dans son proto a unsigned char , et je dois lui
balancer qq chose du style 0x__ et de l'autre coté j'ai un char.
donc je voudrais faire une sorte de concatenation 0x+monChar
ou transformer ce char en val hexa.
je sais pas si je suis clair.


Pour saisir la chaine : fgets()

Pour convertir la chaine hexa, deux solutions :

- strtoul() avec la base 0. Il faut alors saisir 0x....
0x80
0xAA

- strtoul() avec la base 16 Il faut alors saisir en hexa directement :
80
AA

Pour concatener "0x" avec une chaine hexa: sprintf() :

unsigned val = 0x85;
char s[10];

sprintf (s, "0x%02X", val); /* -> "0x85" */

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Moi
Dans l'article <404621e1$0$28121$
écrivait :

mon cas correspond au second que vous decrivez, je veux utiliser une
valeur hexa pour envoyer une commande sur le port serie.


Ben je fais ça aussi quand j'envois des "bytes" (unsigned char)
sur mon bus I2C bricolé sur port série.
Je ne me suis jamais posé la question "conversion".
Si mon périf est à l'adresse 64 ou 0x40 je vois pas la différence.
Si je doit envoyer un 255 ou 0xff à l'adresse du périf je vois pas
où est la différence.

Ca ressemble un peu à ça :

unsigned char device = 0x40;
unsigned char command = 255;

i2c_write(device,command);

Question de notation.

Le pb c que la valeur a envoyer en utilisant 0x__ est un char qui est
recuperé par une fonction native java, donc pour resumer,


java ?

j'ai une fonction qui dans son proto a unsigned char , et je dois lui
balancer qq chose du style 0x__ et de l'autre coté j'ai un char.


Ca fait deux char non ?
Tu confondrais pas char et char* ??????????

donc je voudrais faire une sorte de concatenation 0x+monChar
ou transformer ce char en val hexa.


Pourquoi pas en octal ?

je sais pas si je suis clair.


non, je pige pas trop.

strtol un peu casté pourrait faire l'affaire :


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
unsigned char ma_byte;
ma_byte = (unsigned char) strtol("FF", NULL , 16);
printf("ma_byte = %d %.2Xn" , ma_byte , ma_byte);
return(0);
}

:~/src$ ./strto
ma_byte = 255 FF

Avatar
Pierre Maurette
"Chat" a écrit ...
[...]
mon cas correspond au second que vous decrivez, je veux utiliser une
valeur hexa pour envoyer une commande sur le port serie.
Le pb c que la valeur a envoyer en utilisant 0x__ est un char qui est
recuperé par une fonction native java, donc pour resumer,
j'ai une fonction qui dans son proto a unsigned char , et je dois lui
balancer qq chose du style 0x__ et de l'autre coté j'ai un char.
donc je voudrais faire une sorte de concatenation 0x+monChar
ou transformer ce char en val hexa.
je sais pas si je suis clair.
Je crains que non.

J'imagine que vous avez un char (de Java) sous Java et que vous disposez
d'une fonction en C qui attend un unsigned char (de C) puis se charge de
l'envoyer sur le port série.
Je ne connais pas Java, en tous cas pas la pratique de l'API JNI. Néanmoins,
je remarque que le type char en Java est 16 bits non signé. Il voyagera sous
ce format pour arriver à la routine C comme un jchar (#include <jni.h>,
j'imagine).
Donc, soit vous travaillez (si c'est possible) sur votre code Java pour
envoyer un byte (8 bits signés), soit vous modifiez le prototype de la
fonction C et vous vous débrouillez pour convertir ou caster le jchar (16
bits non signé) en unsigned char (8 bits).
Mais j'ai peut-être mal compris votre demande, puisque je ne vois pas
d'hexadécimal ni de 0x... dans toput ça.
Pierre

Avatar
Chat
Pierre Maurette wrote:
"Chat" a écrit ...
[...]

mon cas correspond au second que vous decrivez, je veux utiliser une
valeur hexa pour envoyer une commande sur le port serie.
Le pb c que la valeur a envoyer en utilisant 0x__ est un char qui est
recuperé par une fonction native java, donc pour resumer,
j'ai une fonction qui dans son proto a unsigned char , et je dois lui
balancer qq chose du style 0x__ et de l'autre coté j'ai un char.
donc je voudrais faire une sorte de concatenation 0x+monChar
ou transformer ce char en val hexa.
je sais pas si je suis clair.


Je crains que non.
J'imagine que vous avez un char (de Java) sous Java et que vous disposez
d'une fonction en C qui attend un unsigned char (de C) puis se charge de
l'envoyer sur le port série.
Je ne connais pas Java, en tous cas pas la pratique de l'API JNI. Néanmoins,
je remarque que le type char en Java est 16 bits non signé. Il voyagera sous
ce format pour arriver à la routine C comme un jchar (#include <jni.h>,
j'imagine).
Donc, soit vous travaillez (si c'est possible) sur votre code Java pour
envoyer un byte (8 bits signés), soit vous modifiez le prototype de la
fonction C et vous vous débrouillez pour convertir ou caster le jchar (16
bits non signé) en unsigned char (8 bits).
Mais j'ai peut-être mal compris votre demande, puisque je ne vois pas
d'hexadécimal ni de 0x... dans toput ça.
Pierre


oui merci ça reponds tout a fait a ma question, l'ennui c que j'ai

vraimment du mal avec ces convertions de type, ou est que vous avez
trouvé les correspondances de type entre Java ET JNI et C, prasque je
verifie pas systemetiquement mes types, des fois j'ai des variables qui
se baladent de java-->JNI-->C-->java et fatalement des fois ça plante
Dans la doc JNI ils donnent les "correspondances" JNI et JAVA mais ça se
complique quand une varaible type jchar va se balader du coté d'une
fonction C normale.


Avatar
Pierre Maurette
"Chat" a écrit ...
[...]
oui merci ça reponds tout a fait a ma question, l'ennui c que j'ai
vraimment du mal avec ces convertions de type, ou est que vous avez
trouvé les correspondances de type entre Java ET JNI et C,
Revue "Login:" de novembre 2003.


prasque je
verifie pas systemetiquement mes types, des fois j'ai des variables qui
se baladent de java-->JNI-->C-->java et fatalement des fois ça plante
Dans la doc JNI ils donnent les "correspondances" JNI et JAVA mais ça se
complique quand une varaible type jchar va se balader du coté d'une
fonction C normale.


Les j-types (jchar, jboolean, jint, etc.) sont physiquement définis (nombre
exact de bits et signé/non signé). Les types de C ne le sont pas. La
correspondance dépend donc de l'implémentation. J'imagine que vous incluez
<jni.h>, vous pouvez donc utiliser directement les types JNI. Vous pouvez
d'ailleurs consulter ce fichier <jni.h>.
Personnellement (coté C), je commencerais par modifier ma fonction. Si le
paramètre est un unsigned char, ce n'est pas un caractère. Dans l'esprit,
c'est un octet que vous expédiez à la sortie série. Donc:
Typedef unsigned char _uint8; /* ou byte, ubyte, octet, etc. */

A vous de voir ensuite si par exemple le type char de Java, et donc jchar,
se prête à :

type Fonction(jchar param, ...)
{
_uint8 Valeur = (_uint8)(param % 256);
/* etc */

(Google est certainement très généreux sur le sujet)

Pierre