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

  FORUM HardWare.fr
  Programmation
  C++

  Agencement des bits dans un bitfield

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Agencement des bits dans un bitfield

n°1113666
chicotruss
Posté le 09-06-2005 à 10:45:29  profilanswer
 

Salut, comme mon titre l'indique j'ai une petite interrogation au niveau de l'agencement des bits en utilisant des bitfields:
 
J'ai des données qui sont toujours alignées sur des octets (byte alignement) avec des groupes de bits correspondants chacun à une variable.
Voici mon code pour un type particulier (ici NAL_first_byte = 1 octet)
 

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. typedef struct {
  5. unsigned int forbidden_zero_bit : 1;
  6. unsigned int nal_ref_idc : 2;
  7. unsigned int nal_unit_type : 5;
  8. } NAL_first_byte;
  9. int main(int argc, char** argv) {
  10. cout << "sizeof(NAL_first_byte): " << sizeof(NAL_first_byte) << endl;
  11. void* buffer;
  12. int size;
  13. /* load file */
  14. ifstream file;
  15. file.open("1s.h264", ios::in | ios::binary);
  16. if(!file.is_open()) {
  17.  cerr << "unable to read" << endl;
  18.  return(1);
  19. }
  20. file.seekg(0, ios::end);
  21. size = file.tellg();
  22. file.seekg(0, ios::beg);
  23. buffer = malloc(size);
  24. file.read((char*)buffer, size);
  25. file.close();
  26. /* process data */
  27.     int offset = 4; //l'octet qui m'interesse est à l'offset 4
  28. NAL_first_byte b;
  29. memcpy((char*)&b, (char*)buffer + offset, sizeof(b));
  30. /* display result */
  31. cout << "NAL Header\nReserved Bit: " << b.forbidden_zero_bit << "\nReference IDC: " << b.nal_ref_idc << "\nNAL Unit Type: " << b.nal_unit_type << endl;
  32. /* free buffer */
  33. free(buffer);
  34. system("pause" );
  35. return(0);
  36. }


 
Donc avec ce code ci je prends l'exemple sur mon octet qui vaut 0x67 (->en binaire = 0 11 00111)
 
en résultat, j'obtiens (avec dev-cpp 4.9.9.2 (gcc 3.4.2)):
 
sizeof(NAL_first_byte): 4
NAL Header
Reserved Bit: 1
Reference IDC: 3
NAL Unit Type: 12

 
alors que ce que je souhaitais obtenir c'est:
 
sizeof(NAL_first_byte): 4
NAL Header
Reserved Bit: 0
Reference IDC: 3
NAL Unit Type: 7

 
j'ai alors remarqué que cela correspondait à un agencement des données en sens inverse -> 01100 11 1 (ordre 5-2-1 au lieu de 1-2-5 pour la lecture des bits)
 
J'ai donc trouvé sur le web:
 

Citation :

La manière dont les différents groupes de bits sont placés en mémoire dépend du compilateur et n'est pas normalisée.


 
Donc j'en arrive à ma question, bien que ce ne soit pas normalisé, est ce que les compilateurs garantissent au moins que la lecture ce fait de gauche à droite ou de droite à gauche uniquement (dans mon exemple 5-2-1 ou 1-2-5) et que je ne risque pas d'avoir des cas du type (1-5-2, 2-1-5, etc.) ? Cela simplifirait la lecture plutot que de le faire manuellement avec des masques et décalages.
 
Ca pourrait être sympa d'afficher les résultats obtenus en fonction du compilateur utilisé pour ceux qui veulent bien tester (le code suivant permet de tester sans le fichier que j'utilise)
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. typedef struct {
  4. unsigned int forbidden_zero_bit : 1;
  5. unsigned int nal_ref_idc : 2;
  6. unsigned int nal_unit_type : 5;
  7. } NAL_first_byte;
  8. int main(int argc, char** argv) {
  9. cout << "sizeof(NAL_first_byte): " << sizeof(NAL_first_byte) << endl;
  10. char value = 0x67;
  11. NAL_first_byte b;
  12. memcpy((char*)&b, &value, sizeof(b));
  13. /* display result */
  14. cout << "NAL Header\nReserved Bit: " << b.forbidden_zero_bit << "\nReference IDC: " << b.nal_ref_idc << "\nNAL Unit Type: " << b.nal_unit_type << endl;
  15. system("pause" );
  16. return(0);
  17. }


Message édité par chicotruss le 10-06-2005 à 00:05:34
mood
Publicité
Posté le 09-06-2005 à 10:45:29  profilanswer
 


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

  Agencement des bits dans un bitfield

 

Sujets relatifs
calcul du nombre de bitsIsoler les bits d'un octets [Débutant inside]
mode reel sur 16 bit / mode protégé sur 32 bits ?lecture des n prochains bits du buffer...
un nombre de 1024 bits fait combien de chiffres ?Bits
[C] gerer des champs de bits[C++] representer un nombre 64 bits
Quel debuggeur 16 bits marchant sous dos ?Oracle 8i: Driver ODBC 16 bits pour Windows 2000
Plus de sujets relatifs à : Agencement des bits dans un bitfield


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