Agencement des bits dans un bitfield

Agencement des bits dans un bitfield - C++ - Programmation

Marsh Posté le 09-06-2005 à 10:45:29    

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
Reply

Marsh Posté le 09-06-2005 à 10:45:29   

Reply

Sujets relatifs:

Leave a Replay

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