PB en C !!! PB avec poids fort ! poids faible ! [RESOLU]

PB en C !!! PB avec poids fort ! poids faible ! [RESOLU] - C++ - Programmation

Marsh Posté le 25-10-2002 à 11:27:39    

voila mon PB, je veux convertir des valeurs entieres en les reformatant sur un format choisi (ex 32 bits) et en isolant les poids faibles et poids fort.
 
exemple:MSG_SIZE=194 (soit c2 en hexa)
 

Code :
  1. formatIntegerIntoDataCodedOn32Bits(MSG_SIZE, 0, ByteStream);
  2. printf("\nByStream =%2.2x%2.2x%2.2x%2.2x",ByteStream0],ByteStream[1],ByteStream[2],ByteStream[3]);


 
avec : formatIntegerIntoDataCodedOn32Bits defini comme suit :
 

Code :
  1. void formatIntegerIntoDataCodedOn32Bits(int data, int k, char ByteStream[MAX_NUMBER_OF_CHAR_PER_LINE])
  2. {
  3. int high,low,pd1,pd2,pd0,rest;
  4. high=data/65536;
  5. //printf("\n high = %d",high);
  6. ByteStream[k]=(char)high;
  7. rest=data%65536;
  8. pd2=rest/4096;
  9. //printf("\n pd2 = %d",pd2);
  10. ByteStream[k+1]=(char)pd2;
  11. rest=rest%4096;
  12. pd1=rest/256;
  13. printf("\nor IntegerIntoDataCodedOn32Bits pd1 = %d",pd1);
  14. ByteStream[k+2]=(char)pd1;
  15.     pd0=rest%256;
  16. printf("\nfor IntegerIntoDataCodedOn32Bits pd0 = %d",pd0);
  17. ByteStream[k+3]=(char)pd0;
  18. }


 
 
au lieu de m'afficher 000000c2
 
j'affiche 000000ffffffc2
 
quelqu'un saurait-il pourquoi ?


Message édité par Le_Chab le 25-10-2002 à 15:00:47
Reply

Marsh Posté le 25-10-2002 à 11:27:39   

Reply

Marsh Posté le 25-10-2002 à 11:54:49    

bon je precise que pour extraire chaque poids fort, poids faible j'utilise la division entiere et le modulo... putain ca doit etre tellement con que je ne trouve pas pourquoi ca ne marche pas ... en fait j'ai remarque que sur certaines valeurs ca marchait trop bien ... du coup je suis pomme je comprends plus ...  
 
 
HELP !

Reply

Marsh Posté le 25-10-2002 à 12:01:34    

formatIntegerIntoDataCodedOn32Bits, t'as pas plus court comme nom ? [:ddr555]
 
je regarderais ton soucis un peu plus tard, la fo que j'aille bouffer ;)
 
 

Reply

Marsh Posté le 25-10-2002 à 12:05:51    

chrisbk a écrit a écrit :

formatIntegerIntoDataCodedOn32Bits, t'as pas plus court comme nom ? [:ddr555]
 
je regarderais ton soucis un peu plus tard, la fo que j'aille bouffer ;)
 
 
 




 
skool ! ouais je sais mes noms de fonctions doivent parler d'eux meme donc ils font toujours 30 m de long ....  
 :D

Reply

Marsh Posté le 25-10-2002 à 13:06:55    

A tout hasard, en utilisant des longs au lieu de (int data, int k, .. ca irait pas mieux ?
 
int / 65536, je sais pas si ça donne toujours ce qu'on en attend. Les unsigned int vont de 0 jusqu'à 65535.
 
 :heink: Je parle des int 16 bits (c'est mon quotidien), je pense que ma remarque est déplacée (je l'efface quand solution trouvée).
 
EDIT : Pour les noms à rallonge, je fais un peu pareil (+ "facile" à lire) grâce au Copier/coller. :D


Message édité par Carbon_14 le 25-10-2002 à 13:07:59
Reply

Marsh Posté le 25-10-2002 à 14:04:12    

carbon_14 a écrit a écrit :

A tout hasard, en utilisant des longs au lieu de (int data, int k, .. ca irait pas mieux ?
 
int / 65536, je sais pas si ça donne toujours ce qu'on en attend. Les unsigned int vont de 0 jusqu'à 65535.
 
 :heink: Je parle des int 16 bits (c'est mon quotidien), je pense que ma remarque est déplacée (je l'efface quand solution trouvée).
 
EDIT : Pour les noms à rallonge, je fais un peu pareil (+ "facile" à lire) grâce au Copier/coller. :D  




 
 
 
je vais faire un essai tout de meme avec des long... merci carbon_14 !

Reply

Marsh Posté le 25-10-2002 à 14:22:41    

en fait c'est sur l'affichage du pd0 que ca merde !

Code :
  1. pd0=rest%256;


 
sachant ensuite que je le caste sur un char, je me demande si ce n'est pas ca qui met le bronx ?...  

Reply

Marsh Posté le 25-10-2002 à 14:50:02    

ca y est j'ai trouve ! pour toute donnee entiere superieure ou egale a 128, lorsque je veux caster cette donnee sur un char ben au niveau affichage ca plantouille on dirais ....
 
 
genre:    
 n=127 :   result=(char)127;  j'affiche 7f pour result.
 n=128 :   result=(char)128;  j'affiche ffffff80 pour result.


Message édité par Le_Chab le 25-10-2002 à 14:51:10
Reply

Marsh Posté le 25-10-2002 à 14:56:02    

On n'y pense pas toujours, mais un char est "signé"
 
unsigned char  8 bits 0 to  255
char 8 bits -128  to  127
 
EDIT : extrait de l'aide de mon BORLAND préféré.


Message édité par Carbon_14 le 25-10-2002 à 14:56:29
Reply

Marsh Posté le 25-10-2002 à 15:00:22    

carbon_14 a écrit a écrit :

On n'y pense pas toujours, mais un char est "signé"
 
unsigned char  8 bits 0 to  255
char 8 bits -128  to  127
 
EDIT : extrait de l'aide de mon BORLAND préféré.




 :jap:  
 
ouais c'etait bien ca ! arf dur d'etre un newbie ...  
 
Merci a tous ! ca marche nickel !
 :hello:

Reply

Marsh Posté le 25-10-2002 à 15:00:22   

Reply

Marsh Posté le 25-10-2002 à 15:03:29    

En fait, ça m'était sorti de la tête (y a plein de chimie dedans :)).
Merci d'avoir permis de remettre les choses en place (je vais lorgner sur mes prog voir si je me fait pas aussi pièger qq fois).
 :jap:

Reply

Marsh Posté le 25-10-2002 à 18:14:04    

ça t'interesse p'tete pas, mais sous Windows y'a les Macros:
 

Code :
  1. WORD HIWORD(DWORD dwValue);
  2. WORD LOWORD(DWORD dwValue);


 
Si tu veux faire ça toi même ou si tu ne disposes pas de ces macros sous Borland, un bon truc du style:
 

Code :
  1. HIWORD(my32bitValue) ((WORD)(((DWORD)(my32bitValue) >> 16) & 0xFFFF))


 
sera plus clean pour extraire les 2 octets de poids fort d'un entier 32 bits.
Même principe octet par octet.
 
C'est pas mieux?


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 26-10-2002 à 23:37:35    

unsigned char //de         0 à UCHAR_MAX
signed char   //de SCHAR_MIN à SCHAR_MAX
char          //de  CHAR_MIN à  CHAR_MAX

"char" est signé ou pas selon les implémentations... c'est un type distinct.
Il faut noter que rien ne garantit qu'un char fasse 8 bits...
 
Je pense qu'il y a erreur, tu extraits des quartets au lieu d'octets.
Enfin, c'est de la manipulation de bits, pas de l'arithmétique...
 
Je propose ceci:

Code :
  1. //Les signages de "ByteStream" et de "data" doivent être correspondre.
  2. void formatIntegerIntoDataCodedOn32Bits(signed int data, int k, signed char ByteStream[MAX_NUMBER_OF_CHAR_PER_LINE])
  3. {
  4. ByteStream[k+0]= (data>>24)&0xFF;
  5. ByteStream[k+1]= (data>>16)&0xFF;
  6. ByteStream[k+2]= (data>> 8)&0xFF;
  7. ByteStream[k+3]= (data>> 0)&0xFF;
  8. }


Ou encore plus simple:

Code :
  1. //Aucune contrainte sur le type de data ou le signage de ByteStream
  2. void formatIntegerIntoDataCodedOn32Bits(int data, int k, char ByteStream[MAX_NUMBER_OF_CHAR_PER_LINE])
  3. {
  4. char* pdata= (char*)&data;
  5. ByteStream[k+0]= pdata[3];
  6. ByteStream[k+1]= pdata[2];
  7. ByteStream[k+2]= pdata[1];
  8. ByteStream[k+3]= pdata[0];
  9. }


Ne pas oublier:

Code :
  1. #include <assert.h>
  2. assert(sizeof(int)==4);


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

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