Probleme taille structure / parsing tag mp3
Bonjour a tous,
voila j'essaye d'écrire un petit programme qui lit les tag ID3 d'un fichier mp3,
j'ai bien regardé la spec du format, et j'ai la structure suivante pour récupere le header d'un tag :
Code:
1 2 3 4 5 6 7
|
typedef struct {
unsigned char id[3];
unsigned char revision[2];
unsigned char flags;
unsigned int size;
} ID3V2_header_t; |
Le header fait donc exactement 10 bytes, seulement voila, alors que ma structure devait en faire 10 aussi (3 + 2 + 1 + 4), lorque que je fait
sizeof(ID3V2_header_t) j'obtient 12 ... :?
J'ai regardé sur la FAQ C ou il est dit que cela peut venir d'un probleme d'alignement des bits ? mais comment y remédier ? Est qu'il faut que je passe par l'operateur ":" pour spécifier explicitement la taille de chacun de mes champs en bits ? cad :
Code:
1 2 3 4 5 6 7
|
typedef struct {
unsigned char id[3] : 24
unsigned char revision[2] : 16
unsigned char flags : 8
unsigned int size : 32
} ID3V2_header_t; |
?
Voila, tout aide sera la bienvennue :)
(sachant que j'ai deja un autre pb en rab, mais je le garde pour le prochain post :roll: )
PS : si vous voulez plus d'informations, voila un lien vers la spec des tags :
http://www.id3.org/id3v2.3.0.html
Re: Probleme taille structure / parsing tag mp3
Citation:
Envoyé par lucas_sophia
voila j'essaye d'écrire un petit programme qui lit les tag ID3 d'un fichier mp3,
j'ai bien regardé la spec du format, et j'ai la structure suivante pour récupere le header d'un tag :
Code:
1 2 3 4 5 6 7
|
typedef struct {
unsigned char id[3];
unsigned char revision[2];
unsigned char flags;
unsigned int size;
} ID3V2_header_t; |
Erreur de conception fréquente. En C, il n'est pas possible de mapper une structure sur un flux de bytes de façon portable, et ce pour de nombreuses raisons :
- La taille des types n'est pas portable
- La représentation des valeurs numériques n'est pas portable
- L'alignement des données n'est pas portable
Citation:
Le header fait donc exactement 10 bytes, seulement voila, alors que ma structure devait en faire 10 aussi (3 + 2 + 1 + 4), lorque que je fait
sizeof(ID3V2_header_t) j'obtient 12 ... :?
Démonstration faite.
Pour être portable, extraire les données à la main (tableau de unsigned char) dans une structure interne.
Idem dans l'autre sens. Les structures ne peuvent pas servir à implémenter des interfaces externes de façon portable. Jamais.