Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2725 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1870102
gaellm
Posté le 06-04-2009 à 14:44:38  profilanswer
 

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
mood
Publicité
Posté le 06-04-2009 à 14:44:38  profilanswer
 

n°1870135
Un Program​meur
Posté le 06-04-2009 à 15:09:51  profilanswer
 

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).

n°1870138
bjone
Insert booze to continue
Posté le 06-04-2009 à 15:12:56  profilanswer
 

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
n°1870150
gaellm
Posté le 06-04-2009 à 15:28:57  profilanswer
 

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?

n°1870155
Un Program​meur
Posté le 06-04-2009 à 15:37:38  profilanswer
 

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 &.

n°1870156
bjone
Insert booze to continue
Posté le 06-04-2009 à 15:40:22  profilanswer
 

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
n°1870161
gaellm
Posté le 06-04-2009 à 15:50:32  profilanswer
 

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...

n°1870171
Un Program​meur
Posté le 06-04-2009 à 16:09:12  profilanswer
 

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];

n°1870173
gaellm
Posté le 06-04-2009 à 16:17:36  profilanswer
 

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 !  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[Résolu] Ajax, XMLhttpRequest, interrogation multiples et simultannéesplacement de texte[résolu]
Problème d'occurence variable [RESOLU][Résolu] Edit mono-ligne avec retour à la ligne ?
[Résolu] Comparatif IBM Rational Application Developer / Eclipse[Résolu]Syntaxe dans un script php
recherche dans un recordset [Résolu]Javascript : pb avec des Frames (résolu)
[Résolu] Cacher, afficher une ligne de tableau <TR> en Javascript 
Plus de sujets relatifs à : placer un uint>255 dans un buffer [résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR