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

  FORUM HardWare.fr
  Programmation
  C

  [résolu] Problème de bitfields et d'alignement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[résolu] Problème de bitfields et d'alignement

n°1796158
Riot
Buy me a riot
Posté le 06-10-2008 à 16:37:17  profilanswer
 

Bonjour,
 
Je suis en train de mettre au point du code pour parser des tables SI/PSI que je reçois en DVB.
Pour ça, au lieu d'utiliser des masques et des shifts, je voudrais utiliser des bitfields ; voici un exemple simplifié :
 

Code :
  1. struct huhu
  2. {
  3. unsigned char table_id      :8;
  4. unsigned char section_syntax_indicator  :1;
  5. unsigned char dummy       :1;
  6. unsigned char reserved1      :2;
  7. unsigned char section_length_hi    :4;
  8. };
  9. void parseTest()
  10. {
  11. huhu table;
  12. unsigned char stream[ 2 ] = { 0, 0xB0 };
  13. memcpy( &table, (huhu*)stream, sizeof(huhu) );
  14. }


 
Ce que je suis censé obtenir est (0xB0 vaut 10110000 en binaire):
table_id : 0
section_syntax_indicator : 1
dummy : 0
reserved1 : 3
section_length_hi : 0
 
Le problème est que j'obtiens :
table_id : 0
section_syntax_indicator : 0
dummy : 0
reserved1 : 0
section_length_hi : 0x0B
 
Je travaille avec Visual Studio 2005.
 
Est-ce que vous auriez une idée du problème ? C'est un soucis d'alignement ?
Merci d'avance.


Message édité par Riot le 07-10-2008 à 13:44:16

---------------
Be the one with the flames.
mood
Publicité
Posté le 06-10-2008 à 16:37:17  profilanswer
 

n°1796180
theshockwa​ve
I work at a firm named Koslow
Posté le 06-10-2008 à 16:48:46  profilanswer
 

c'est plutôt un souci d'endianess, il me semble

n°1796256
Riot
Buy me a riot
Posté le 06-10-2008 à 17:48:37  profilanswer
 

Oui mais si je remplace
unsigned char stream[ 2 ] = { 0, 0xB0 };
par
unsigned char stream[ 2 ] = { 0, 0x0B };
je n'obtiens pas le résultat attendu, mais ceci :
table_id : 0
section_syntax_indicator : 1
dummy : 1
reserved1 : 2
section_length_hi : 0


Message édité par Riot le 06-10-2008 à 18:17:39

---------------
Be the one with the flames.
n°1796268
theshockwa​ve
I work at a firm named Koslow
Posté le 06-10-2008 à 17:58:41  profilanswer
 

Ca me semble pourtat être précisément le résultat à attedre das les deux cas, ce que tu obtiens ...
 
quand tu déclares tes bitfields, rappelle-toi bien que tu commences par les bits de poids faible. Ce que tu copies dans ta structure au final, c'est ca :
1011 0000 0000 0000
 
donc tes 4 bits de poids le plus fort valent 0xB comme prévu.
 
Je ne vois pas comment ca aurait pu se transformer en ca : 0000 1101 0000 0000


Message édité par theshockwave le 06-10-2008 à 17:59:13
n°1796272
Taz
bisounours-codeur
Posté le 06-10-2008 à 18:09:01  profilanswer
 

Mais c'est quoi ton résultat attendu ?

n°1796276
Riot
Buy me a riot
Posté le 06-10-2008 à 18:16:23  profilanswer
 

Ok, donc tu me dis que pour obtenir ce que je souhaite, il faut que j'inverse mes bits de poids fort et de poids faible dans ma structure ?

 

En passant de :

Code :
  1. struct huhu
  2. {
  3. unsigned char table_id      :8;
  4. unsigned char section_syntax_indicator  :1;
  5. unsigned char dummy       :1;
  6. unsigned char reserved1      :2;
  7. unsigned char section_length_hi    :4;
  8. };
 

à :

Code :
  1. struct huhu
  2. {
  3. unsigned char table_id      :8;
  4. unsigned char reserved1      :2;
  5. unsigned char dummy       :1;
  6. unsigned char section_syntax_indicator  :1;
  7. unsigned char section_length_hi    :4;
  8. };
 

C'est bien ça ?

  

Pour Taz, à partir de "00B0", je veux que ma structure soit remplie de la sorte :
table_id : 0
section_syntax_indicator : 1
dummy : 0
reserved1 : 3
section_length_hi : 0

 

edit : je voulais dire "0B0" et pas "00B0"


Message édité par Riot le 06-10-2008 à 20:46:07

---------------
Be the one with the flames.
n°1796282
theshockwa​ve
I work at a firm named Koslow
Posté le 06-10-2008 à 18:37:54  profilanswer
 

0x00B0 n'est pas équivalent à { 0, 0xB0}

n°1796324
Riot
Buy me a riot
Posté le 06-10-2008 à 20:45:42  profilanswer
 

Boulette, je voulais écrire "0B0".


---------------
Be the one with the flames.
n°1796574
matafan
Posté le 07-10-2008 à 12:54:48  profilanswer
 

Le C ne définit pas par quel côté un bit field commence. Pour certain compilos les champs déclarés en premier sont les bits de poid faible, pour d'autres (genre xlc) ce sont les bits de poid fort.

n°1796581
Riot
Buy me a riot
Posté le 07-10-2008 à 13:43:30  profilanswer
 

Ouais, je pense que c'est vraiment trop peu sûr pour que je mette ça en place.

 

Pour info, j'ai trouvé la solution. Il faut inverser les champs comme suit :

Code :
  1. struct huhu
  2. {
  3. unsigned char table_id      :8;
  4. unsigned char section_length_hi    :4;
  5. unsigned char reserved1      :2;
  6. unsigned char dummy       :1;
  7. unsigned char section_syntax_indicator  :1;
  8. };
 

En gros on dirait que dès que la taille des champs est inférieure à l'octet, il faut inverser l'ordre.

 

Merci pour votre aide.


Message édité par Riot le 07-10-2008 à 13:43:47

---------------
Be the one with the flames.
mood
Publicité
Posté le 07-10-2008 à 13:43:30  profilanswer
 

n°1796713
Taz
bisounours-codeur
Posté le 07-10-2008 à 17:43:12  profilanswer
 

pour ton architecture particulière.

n°1796728
theshockwa​ve
I work at a firm named Koslow
Posté le 07-10-2008 à 18:38:47  profilanswer
 

mea culpa, je me souvenais d'une page de la msdn (pas celle ci, mais une qui exprimait une idée approchante : http://msdn.microsoft.com/en-us/library/ewwyfdbe.aspx )
mais effectivement, il est écrit noir sur blanc dans le K&R que c'est à la discrétion de l'implémentation :)


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

  [résolu] Problème de bitfields et d'alignement

 

Sujets relatifs
Problème d'execution de module perlProblème d'ordre de superposition une image affichée avec onmouseover
probleme C (surement facile a regler )probleme affichage site
Probleme avec eclipse et plugin svnproblème pour faire du Caml avec Emacs
Problème avec date_selectproblème avec TDBGrid et ses items
Probleme script kix32Probleme avec la fontion "imagecreatefrompng" pour redimmensionner une
Plus de sujets relatifs à : [résolu] Problème de bitfields et d'alignement


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