[c++]Obsługa tagów mp3

0

witam,
korzystając z tego artykułu: ID3 Tag v2 chciałem odczytać tagi z pliku mp3. Napisałem taki oto kod:

struct Tag{
  char frameid[4];
  int size;
  char smieci[3];
  char *tresc;
  
};

int main () {
  ifstream is;
  Tag id3;
  is.open ("/home/loganek/Muzyka/test.mp3", ios::binary );
  is.seekg(10, ios::beg);
  is.read((char*)&id3, sizeof(Tag));
  printf(id3.size);
  
  is.close();
  
}

jednak id3.size nie jest poprawną wartością. W związku z tym mam pytanie; co w tym kodzie jest nie tak?

0

moze ten plik ma inna strukture? sprawdzales hexeditem?
moze kompilator dorzuca Ci align w struct Tag? sprobuj u'pack'owac
moze endianess? sprawdz hexeditem lub sprobuj odwrocic

poza tym, czytanie binarne pola char* tresc bedzie mialo zgoła inny efekt niż zakladasz

0

To bardzo kulawa implementacja, id3v2 nie jest taki prosty. Po co zreszta wymyslac koło na nowo: http://id3lib.sourceforge.net/ i masz biblioteke do C++ obslugująca calosc standardu łącznie z osadzaniem obrazków w pliku i innymi cudami

0

ok, poradzilem sobie zmieniając nieco strukturę na taką:

struct Tag{
  char frameid[4];
  bool pr[4];
  char smieci[3];
  char *tresc;
  
};

odziwo z boolem działa, zapisuje liczby większe niż 1. Dla czego? Nie wiem
Jednak pojawia się kolejny problem. Odczytuje dane w następujący sposób:


int main () {
  ifstream is;
  Tag id3;
  char t;
  is.open ("/home/loganek/test.mp3", ios::binary );
  is.seekg(10, ios::beg);
  is.read((char*)&id3, sizeof(Tag));
  int a=id3.pr[3]; //zazwyczaj nie przekracza 255, więc można to tak rozwiązać;)
  id3.tresc=new char[a];
  is.read((char*)&id3, sizeof(Tag));
  cout<<id3.tresc;
  is.close();
}

i nie działa, jednak jeśli zmienię strukturę na taką:


struct Tag{
  char frameid[4];
  bool pr[4];
  char smieci[3];
  char tresc[6]; //znana mi wartość
  
};

wszystko działa ok. Jak należy utworzyć tą tablicę dynamicznie żeby działało? I skąd wynika dziwne zachowanie zmiennych bool?

1 użytkowników online, w tym zalogowanych: 0, gości: 1