Vielleicht liegt das an der Tatsache, dass im char die Terminierung fehlt?
definitiv
von an QDataStream solltest vielleicht doch eher die FInger lassen ...
es funktioniert zwar auch zum einlesen mit doubles, floats, ints aller sorten und groessen, ohne das QT da eigene Verwaltungsdaten schreibt, aber das muss so nicht bleiben, und das matchen der QT ints auf die c++ ints muss 100% funktionieren, sonst gibts datenmuell ^^
Den Vorteil den von QDatastream erhaelst, wird dir wahrscheinlich nichts nutzen, eher vielleicht schaden anrichten : es wandelt in eine Plattformunabhaengige Bytefolge, so das auf unterschidlichen plattformen die Dateien lesen kannst.
Besser wie Christian81 vorschlägt, selber binaer lesen ...
Und wo doch so schoen deinen Haeder Binaer sauber spezifiziert hasst !
besser und weniger unstaendlich:
Code: Alles auswählen
struct Header
{
char id[4];
quint32 len;
char type[4];
};
QFile f(file_name);
f.open(QIODevice::ReadOnly);
Header head;
/// nun das lesen, aber in einem Block
qint64 iread = f.read(reinterpret_cast<char *>(&head,sizeof(Header )));
/// nen check
if(iread == sizeof(Header))
{
/// TODO ...
}
Wobei die Logic ned ganz stimmt. RIffs koennen mehrere Chunks haben ... du baust was, was nur einen Chaunk kann ....
das einzige was noch ueber bleibt, ist wie deine "char id[4]" und "char type[4]" ordnungsgemaes interpretierst ....
DIe dinger sind wirklich immer 4 Buchstaben ohne /0 terminator.
Der performanteste weg waere die als 4 byte ints zu behandeln ... also statt char[4] gleich quint32 zu nehmen.
DU musst eh die bekannten typen irgendwo definieren als komstanten ... da kannst die auch gleich in ints verwandeln ...
"RIFF" würde z.b. zu "R" + "I" + "F" + "F" -> 0x52 + 0x49 + 0x46 + 0x46 -> wir haben little endian bei wav, also Byte reihenfolge anpassen -> 0x46464952
also wenn nun
D == 0x46464952 ) wahr ergibt, ist deine erster chunk der Main chunk von ner wave datei ...
Alternativ hat QSTring nen Konstruktor "QString::QString( const QByteArray & ba )" und QByteArray kannst wiederum so konstruieren QByteArray::QByteArray ( const char * data, int size )
und schon bekommst aus deinen 4 fixen char buchstaben ne utf16 basierende 0 terminierte Zeichenkette.
wobei das IMHO unnötig unperformant ist, die strings wirst ja ned staendig brauchen auser fuer debug zwecke ^^
Ciao ...