[C++] Utilisation de memcpy

Utilisation de memcpy [C++] - C++ - Programmation

Marsh Posté le 09-03-2005 à 12:48:46    

Sous les ordres de chrisbk j'ai utilisé memcpy,
 
Sauf que j'ai un petit problème
 

Code :
  1. #include <iostream>
  2. int main()
  3. {
  4.     short buffer[2];
  5.     long valeur;
  6.     buffer[0] = 0x0001;
  7.     buffer[1] = 0x2000;
  8.     memcpy(&valeur, &buffer[0], 4);
  9.    
  10.     std::cout << valeur;
  11. }


 
Personnellement ce que j'aimerais, c'est buffer[0] + buffer[1] donne :
0x00012000, or là, ca donne 0x20000001 !
 
Il suffirait d'intervertir me direz vous, mais non ;) En réalité mon buffer est bien plus gd et se range dans une structure ;)
 
edit : Au fait mon code est en C++, là je sais que memcpy c'est très C-like
Alors si vous avez une commande en C++...


Message édité par kowalski le 09-03-2005 à 13:02:25
Reply

Marsh Posté le 09-03-2005 à 12:48:46   

Reply

Marsh Posté le 09-03-2005 à 13:02:02    

C'est pas un up, c'est juste pour dire que je peux éventuellement passer par un fichier en faisant fwrite/fread, mais spabo et c'est lent
Je sais que j'en ai déjà discuté avec chrisbk sur un autre topic, le memcpy était satisfaisant, mais c'est logique qu'il traite le buffer comme ca, donc ca ne peut pas me convenir pour ce que je fais... :/


Message édité par kowalski le 09-03-2005 à 13:03:22
Reply

Marsh Posté le 09-03-2005 à 13:05:53    

   Les données en mémoire sont toujours écrites de l'octet le moins élevé au plus élevé. si j'ai un registre qui contient 0001, les données en mémoires seront 01 00. Si mon registre contient 00012000 en mémoire il y aura 00 20 01 00. Or tu as chargé 01 00 puis 00 20 soit 01 00 00 20 qui rechargé dans un registre donnent 20000001. Si tu ne veux pas avoir à faire ces convertions, utilise une union.

Reply

Marsh Posté le 09-03-2005 à 13:36:00    

tu veux faire quoi ?

Reply

Marsh Posté le 09-03-2005 à 14:04:31    

J'ai un buffer provenant d'une carte avec par exemple
0x5124 0x5478 0x2575 0x2477 etc etc.
Que je range dans une structure
 
long Champ1 (0x51245478)
short Champ2 (0x2575)
short Champ3 (0x2477)
 
Le buffer est bien évidemment plus long et la structure très longue aussi, donc je pensais utiliser memcpy...

Reply

Marsh Posté le 09-03-2005 à 14:12:05    

videaste95 a écrit :

Les données en mémoire sont toujours écrites de l'octet le moins élevé au plus élevé. si j'ai un registre qui contient 0001, les données en mémoires seront 01 00. Si mon registre contient 00012000 en mémoire il y aura 00 20 01 00. Or tu as chargé 01 00 puis 00 20 soit 01 00 00 20 qui rechargé dans un registre donnent 20000001. Si tu ne veux pas avoir à faire ces convertions, utilise une union.


 
Si j'utilise une union, ca va me tuer mon arithémtique de pointeurs dans ma structure que j'utilise pour naviguer/afficher/modifier des valeurs...

Reply

Marsh Posté le 09-03-2005 à 14:13:18    

kowalski a écrit :

C'est pas un up, c'est juste pour dire que je peux éventuellement passer par un fichier en faisant fwrite/fread, mais spabo et c'est lent
Je sais que j'en ai déjà discuté avec chrisbk sur un autre topic, le memcpy était satisfaisant, mais c'est logique qu'il traite le buffer comme ca, donc ca ne peut pas me convenir pour ce que je fais... :/


 
J'étais persuadé que fwrite/fread faisait le contraire mais en fait c'est exactement la même chose (bien évidemment, c'est logique), bon bah là ce n'est pas une impasse, mais c'est la merde dirons nous

Reply

Marsh Posté le 09-03-2005 à 14:13:27    

Probleme liitle endian je suppose. Sous Intel les nombres 16/32 bits sonr organisés ainsi en mémoire.
Tu peux définir ta struct et faire un cast sauvage sur ton buffer...

Code :
  1. struct MaStruct
  2. {
  3.     long Champ1;
  4.     short Champ2;
  5.     short Champ3;
  6. };
  7. unsigned char * buffer = ReadRawData();
  8. MaStruct * s = reinterpret_cast<MaStruct*>( buffer );


 
Faut gérer le pragma pack aussi généralement avec ce genre de truc pour pas que le padding dans ta struct crée des surprises...


Message édité par HelloWorld le 09-03-2005 à 14:14:49

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-03-2005 à 14:15:42    

Je vais tester ca, les "..." parlant du cast sauvage veulent dire que ce n'est pas très très recommandé ?

Reply

Marsh Posté le 09-03-2005 à 14:16:32    

c'est bon t'inquiete il y a des pragma à la pelle ;)

Reply

Marsh Posté le 09-03-2005 à 14:16:32   

Reply

Marsh Posté le 09-03-2005 à 14:22:25    

HelloWorld, ReadRawData se trouve dans quelle librairie ?

Reply

Marsh Posté le 09-03-2005 à 14:36:31    

ben si ta structure est le mapping parfait de ce que tu lis, pourquoi tu lis pas directement dedans ?

Reply

Marsh Posté le 09-03-2005 à 14:37:49    

Parce que c'est trop long, il y a trop de champs, et je voulais une fonction d'affichage commune pour toutes mes structures (yen a une 30aine)
 
Taz tu sais toi comment utiliser readrawdata ?

Reply

Marsh Posté le 09-03-2005 à 14:40:29    

je sais pas ce que c'est readrawdata() et je comprends pas ou est le problème dans tout ça. Et quand bien même tu ne saurais pas faire les opérations binaire, l'arithmétique entière classique fonctionne tout aussi bien.

Reply

Marsh Posté le 09-03-2005 à 14:43:24    

videaste95 a bien expliqué le problème côté mémoire, oublions les 30aines de structures, s'il n'y a pas de fonction telle que memcpy faisait tout seul le boulot pendant que j'écarte les doigts de pieds sur une plage au soleil, je passerais évidemment par de l'arithmétique de pointeurs

Reply

Marsh Posté le 09-03-2005 à 14:45:20    

« Les données en mémoire sont toujours écrites de l'octet le moins élevé au plus élevé. »
 
quand je vois ce genre de truc ...  
 
fais comme tu veux, tu te fais chier sur un problème là où il n'y en a pas.

Reply

Marsh Posté le 09-03-2005 à 14:53:45    

Taz a écrit :

« Les données en mémoire sont toujours écrites de l'octet le moins élevé au plus élevé. »
 
quand je vois ce genre de truc ...  
 
fais comme tu veux, tu te fais chier sur un problème là où il n'y en a pas.


 
C'est très mignon.
Je vais faire comme je veux pour résoudre mon problème qui est bien là

Reply

Marsh Posté le 09-03-2005 à 20:06:32    

ReadRawData c'est l'exemple censé représenter "un buffer provenant d'une carte".
Mais si tu lis ça dans un fichier, comme le dit Taz tu fais un fread directement avec ta struct...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-03-2005 à 21:12:50    

fread : Bien sur mais pas dans le cas expliqué avec des mots de 16 bits qui doivent former des mots de 32b ou 64b
 
J'ai géré mon affaire cette après midi, c'était plus pour savoir si des fonctions existaient et éviter de réinventer la roue

Reply

Marsh Posté le 09-03-2005 à 21:20:15    

ben memcpy, istream::read, etc ...

Reply

Marsh Posté le 11-03-2005 à 17:02:41    

Taz a écrit :

ben memcpy, istream::read, etc ...


 
Tu n'as toujours pas compris mon problème, et tu insistes...
Je sais que tu as un niveau infiniment meilleur que moi en C++, mais quand même...
J'avais des fichiers bruts de type : "0x2540 0x2547 0x5757 0x7227 0x5725"
à ranger dans uns structure de données avec des short, des longs, des float, des double...
Je veux que mon premier champ, qui par exemple est long contienne 0x25402547 (les deux mots de 16b collés). Or avec memcpy pour les raisons expliquées contient 0x25472540.
 
Voilà. Mais mon pb est reglé.
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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