placer un uint>255 dans un buffer [résolu]

placer un uint>255 dans un buffer [résolu] - C++ - Programmation

Marsh Posté le 06-04-2009 à 14:44:38    

Bonjour,
 
Je fait appel a la communauté pour un probleme tout bête:
 
Je travail actuellement sur des trames réseaux en développant un driver, j'ai donc des suites d'hexa placés dans des buffers. Je souhaiterais rajouté la taille de mon paquet devant la trame, dans mon buffer, voici comment je procède:
 

Code :
  1. UINT taille=4512; //je place une valeur fixe pour mes tests
  2. memset(pDest,taille,sizeof(taille)); //j'envoie cette valeur dans mon buffer "pDest"
  3. //puis a la suite j'envoie la trame...


 
en hexa 4512 = 11A0, or quand j'affiche ma trame je ne vois que A0  :pfff: : a0 a0 a0 a0 ff ff ff ff ff ff 45 75 ....
 
comment faire pour avoir par exemple : 00 00 11 a0 ff ff ff ff ff ff 45 ...
 
Je suis pas très claire, j'espère que vous voyez mon soucis, merci.


Message édité par gaellm le 06-04-2009 à 16:19:01
Reply

Marsh Posté le 06-04-2009 à 14:44:38   

Reply

Marsh Posté le 06-04-2009 à 15:09:51    

Le memset() que tu donnes donnes la valeur (unsigned char)taille aux sizeof(taille) premiers caracteres du tableau commencant en pDest.
 
Si tu veux que tes chars aient des valeurs differentes

Code :
  1. pDest[3] = taille % 256;
  2. pDest[2] = (taille/256) % 256;
  3. pDest[1] = (taille/256/256) % 256;
  4. pDest[0] = (taille/256/256/256) % 256;


(En supposant que pDest soit bien un pointeur vers unsigned char).

Reply

Marsh Posté le 06-04-2009 à 15:12:56    

char *pdest = gnigni
 
*((UINT*)pdest) = taille;
pdest += sizeof UINT;
 
par contre effectivement, l'endianness reste dépendante du cpu, donc si tu veux du big endian, tu retombe sur la solution de Programmeur (mais avec des >> et & par principe, ou juste un >> )

Message cité 1 fois
Message édité par bjone le 06-04-2009 à 15:40:38
Reply

Marsh Posté le 06-04-2009 à 15:28:57    

pDest est de type PUCHAR, oui. Par contre on ne peux pas passer a travers le fait de devoir choisir le caractere du tableau ? pDest[0], pDest[1],... J'ai l'impression que c'est ce que la méthode de "bjone" propose mais je ne comprend pas son fonctionnement?

Reply

Marsh Posté le 06-04-2009 à 15:37:38    

bjone a écrit :

char *pdest = gnigni
 
*((UINT*)pdest) = taille;
pdest += sizeof UINT;
 
par contre effectivement, l'endianness reste dépendante du cpu, donc si tu veux du big endian, tu retombe sur la solution de Programmeur


 
Il y a aussi des problemes d'alignement qui sont resolus avec ma methode, et -- plus anecdotique -- des problemes de taille.
 

Citation :

(mais avec des >> et & par principe, ou juste un >> si tu en unsigned)


 
Je vois la chose comme la decomposition en base 256, donc c'est division et modulo.  
 
Si tu la vois comme des manipulations de bits, c'est >> et &.

Reply

Marsh Posté le 06-04-2009 à 15:40:22    

On est d'accord :jap:
Mais le plus naturel dans ce cas est le shift (enfin question d'habitude et de pratique, mais du point de vue asm...), d'autant plus que le modulo/masque devrait être superflu.

Message cité 1 fois
Message édité par bjone le 06-04-2009 à 15:41:07
Reply

Marsh Posté le 06-04-2009 à 15:50:32    

Je viens de tester la solution de programmeur, qui marche du feu de dieu :) par contre, derriere je vais devoir faire le chemin inverse pour retrouver le UINT a partir de mon buffer aux adresses 0,1,2,3,4 ca me coince un peu ducou...

Reply

Marsh Posté le 06-04-2009 à 16:09:12    

bjone a écrit :

On est d'accord :jap:
Mais le plus naturel dans ce cas est le shift (enfin question d'habitude et de pratique, mais du point de vue asm...), d'autant plus que le modulo/masque devrait être superflu.


 
Quand j'ecris du C++, j'ecris pas de l'assembleur.  Quand j'ecris de l'assembleur, j'ecris pas du C++.
 
Je pense a cette operation comme a une decomposition en base 256, donc je l'exprime comme ca.
 

gaellm a écrit :

Je viens de tester la solution de programmeur, qui marche du feu de dieu :) par contre, derriere je vais devoir faire le chemin inverse pour retrouver le UINT a partir de mon buffer aux adresses 0,1,2,3,4 ca me coince un peu ducou...


 

Code :
  1. taille = ((p[0]* 256 + p[1])*256 + p[2])*256 + p[3];

Reply

Marsh Posté le 06-04-2009 à 16:17:36    

Merci Beaucoup, ça marche très bien, j'allais partir sur une solution de concaténation, puis d'un passage d'hexa vers decimal, mais tas méthode est plus efficace, et simple a appliquer.
 
Merci beaucoup !  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed