[c] unsigned chars -> long

peon.master

Membre actif
22 Avril 2002
144
5
44
Vernayaz
hello !

j'ai un tableau de Bytes de 4 elements:
unsigned char b[4];
et j'aimerai le convertir en un entier long non signé
unsigned long l;

comme les deux sont stoqués avec 4 Bytes, je pensais qu'un cast pouvait faire l'affaire:
l = (unsigned long)b;

mais ca ne fonctionne pas.
printf("Valeur: %li\n",l);
me retourne une valeur négative qui n'a rien a voir avec le résultat souhaité..
 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par peon.master:</font><hr /> hello !

j'ai un tableau de Bytes de 4 elements:
unsigned char b[4];
et j'aimerai le convertir en un entier long non signé
unsigned long l;

comme les deux sont stoqués avec 4 Bytes, je pensais qu'un cast pouvait faire l'affaire:
l = (unsigned long)b;

mais ca ne fonctionne pas.
printf("Valeur: %li\n",l);
me retourne une valeur négative qui n'a rien a voir avec le résultat souhaité..
<hr /></blockquote>

J'ai rien compris !
ooo.gif
laugh.gif


Ok je sors...
crazy.gif
laugh.gif
laugh.gif


'+
 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par Le Gognol:</font><hr />

J'ai rien compris !
ooo.gif
laugh.gif


Ok je sors...
crazy.gif
laugh.gif
laugh.gif


'+
<hr /></blockquote>

sorry..
bon.. j'ai oublié de dire que c'est du language C

au fait ca ne marche pas non plus en faisant "manuellement":
l = b[0];
l = l &lt;&lt; 8;
l += b[1];
l = l &lt;&lt; 8;
l += b[2];
l = l &lt;&lt; 8;
l += b[3];

Ca veut dire qu'il y a une astuce avec le byte de poids fort d'un "unsigned long"??
 
tu peux faire comme suit :

unsigned long *p;
p = (unsigned long *)b;
l = *p;

Ou

l = b[0];
l =l &lt;&lt; 8;
l |= b[1];
l =l &lt;&lt; 8;
l |= b[2];
l =l &lt;&lt; 8;
l |= b[3];

Sache que le résultat de la 1ère solutions n'est pas nécessairement le même que celui de la 2ème. C'est selon la plateforme. Essaies de comprendre pourquoi
wink.gif


Ce sont des choses bonnes à savoir mais déconseilées dans la pratique.

 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par peon.master:</font><hr />
unsigned long l;

...
mais ca ne fonctionne pas.
printf("Valeur: %li\n",l);
<hr /></blockquote>

plutôt

printf("Valeur: %u \n",l);
 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par WS95000:</font><hr />

plutôt

printf("Valeur: %u \n",l);
<hr /></blockquote>

merci.. le problème venait effectivement du printf.

printf("Valeur: %lu \n",l);
l pour long
u pour unsigned.
 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par peon.master:</font><hr />

printf("Valeur: %lu \n",l);
l pour long
u pour unsigned.
<hr /></blockquote>

Sur un OS 32bit, pas besoin de "l"