dynamisches array will nicht :(



  • hallo, prinzipiell will ich eine id3 - lese - Klasse programmieren soweit so gut.
    (achja ID3tags sind die dinger in MP3s in denen die Informationen über das Lied stecken)

    ID3v2 Tags sind unterschiedlich lang und man kann sich aus dem 10 byte großen Header die gesamt länge ausrechenen. Das funzt schon wunderbar. Nun will ich das file nocheinmal öffnen und anhand der ermittelten Länge den gesamten Tag einlesen um ihn dann weiterverarbeiten zu können --> das ganze über

    char*buffer = new char[lenght] .. seht selbst: (ahja ich verwende Borland Studio 2006)

    [cpp]
            char tagfound[3], header[10];  //buffer für header und TAGgefunden in dem dann stehen sollte "IDE"
    
            TFileStream *MP3; // hm
    
    		MP3 = new TFileStream(path,fmOpenRead);
    		MP3->Read(header,sizeof(header));
    
    	memcpy(tagfound,header,3);
    
    	if(tagfound[0] == 0x49 && tagfound[1] == 0x44 && tagfound[2] == 0x33)  //enter if "ID3" found @ beginning
    	{
    		Tag->TagFound = true;    //Tag ist ein Struct zum speichern der Informationen
    
    		//version
    		AnsiString version = "ID3v2.";
    		version = version + (int)header[3] + "." +(int)header[4];
    		Tag->ID3version = version;
    		//~version
    
    		//size
    		int lenght;
    
    		lenght = lenght | header[6];        // calculating size
    		lenght = lenght << 7;
    		lenght = lenght | header[7];
    		lenght = lenght << 7;
    		lenght = lenght | header[8];
    		lenght = lenght << 7;
    		lenght = lenght | header[9];
    
    		if(header[5] & 0x16)                // is footer present recalc size
    			lenght = lenght + 20;
    		else
    			lenght = lenght + 10;
    
    			// TagSize/Lenght avaliable 
    
    	:arrow:char *buffer = new char[lenght];            
    		MP3->Seek((__int64)0,soBeginning);
    		MP3->ReadBuffer(buffer,sizeof(buffer));
    
    		delete []buffer;
    		buffer = NULL;
    
    		delete MP3;
    
    [/cpp]
    

    beim blauen pfeil passiert das problem und zwar übergebe ich schön braf die länge von zB 1193 bytes nur nach dem einlesen
    hab ich im buffer höchstens 5 bytes drin stehen .. verwende ich einen hardcoded static array buffer gehts wunderbar,
    es nützt auch nichts wenn ichs dynamisch hardcode (char *buffer = new char[1193];)

    das steht drinnen ... buffer: char * :0012F494 : :00A093FC "ID3\x03"

    laut hex editor steht das drin (ersten 10 byte)

    00000000:49 44 33 03 00 00 00 00 09 1f ---> ID3.......

    für jede hilfe dankbar

    birdspider



  • sizeof(buffer) gibt Dir die Größe des Zeigers aus (bei 32Bit Systemem 4 Byte).
    ändere also:

    MP3->ReadBuffer(buffer,sizeof(buffer));
    

    zu:

    MP3->ReadBuffer(buffer,lenght);
    

    btw. lenght wird length geschrieben 😉



  • mal davon abgesehen dass du recht hast 😉 und das sizeof() ein rest vom herumexperimentieren ist hab ich
    folgendes schon probiert:

    [cpp]MP3->ReadBuffer(buffer,sizeof(buffer)); 
    
    MP3->ReadBuffer(buffer,lenght); 	
    
    MP3->ReadBuffer(buffer,1193); 		[/cpp]
    

    leider ohne erfolg



  • Da ich kein Borland benutze, kenn ich mich in der Doku nicht aus.
    Schau mal bei TFileStream nach, ob die Datei im Binär-Modus geöffnet wird etc.
    Vielleicht findest Du da was, das helfen könnte.



  • Es steht vermutlich genau das drin was der Hex-Editor auch anzeigt, wenn die Länge stimmt. Wenn Du das im Debugger aber ausgibst, wird es als C-String interpretiert, und diese haben die Eigenart beim ersten Nullbyte per Definition zuende zu sein.



  • jup danke an alle antwortenden

    LordJaxom hat recht es geht wirklich nur das borland ab dem ersten 0x00 nichts mehr anzeigt

    thx



  • Du kannst beim Debugger des BDS einstellen als was du es ausgegeben haben willst. Bei einem char* Array ist die Vorgabe natürlich String und somit wird beim ersten 0-Byte abgeschnitten. Du kannst das aber auch auf Hex oder Speicherauszug stellen. Dann müsste alles angezeigt werden.



  • HI,

    eigentlich böses off topic, aber ich muß es doch mal loswerden:

    birdspider schrieb:

    ...

    lenght
    

    ...

    Stört den Compiler nicht wirklich, macht aber die Suche später mal richtig schwer.....und wird für Verwirrung sorgen, wenn irgendwo mal "length" auftaucht...
    Und wird auch nicht besser, wenn man es 1000mal schreibt. 😉

    Gruß,

    Simon2.


Anmelden zum Antworten