Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Mit ifstream in struct schreiben. hibyte/lobyte?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.03.2006, 13:56 Uhr
Knief



Hallo zusammen!

Ich will ein MIDI-File-Header auslesen. Habe auch das passende struct dazu:
struct MTHD_CHUNK

Code:
struct MTHD_CHUNK
{    char id[4];
    unsigned long length;

    unsigned short format;
    unsigned short numTracks;
    unsigned short division;
};



Eigentlich eine alltägliche Aufgabe, dachte ich mir, also versuchte ich es wie folgt:

Code:
    const char midiFileName[] = "D:\\Eigene Dateien\\fhbb\\SemAudio\\midi_files\\Barbara_Ann.mid";
    MTHD_CHUNK MThd;
    fstream midiFile(midiFileName, ios::in||ios::binary);

    midiFile.read(reinterpret_cast<char *>(&MThd),sizeof(MThd));

    cout << hex;
    cout << "ID...........: " << MThd.id << endl;
    cout << "Length.......: " << MThd.length << endl;
    cout << "Format.......: " << MThd.format << endl;
    cout << "Num of Tracks: " << MThd.numTracks << endl;
    cout << "Division.....: " << MThd.division << endl;

    cin.get();



Ausgabe sollte sein:
ID...........: MThd
Length.......: 00000006
Format.......: 0001
Num of Tracks: 0013
Division.....: 0078

Ist aber:
ID...........: MThd
Length.......: 6000000
Format.......: 100
Num of Tracks: 1300
Division.....: 7800

Die Bytes werden verkehrt rum auslgelesen!
Ich kann sie zwar auf mühsame weise einzeln aus dem File holen und mit Bit-Shifting die richtigen Zahlen erstellen, aber der Sinn von so einem struct sollte doch sein, dass man schön die Datei reintröpfeln kann und dann seine Informationen kriegt, oder?
Gibts ne möglichkeit, die HI- und LOBytes umzukehren?
Evtl. andere Methoden um Dateien auszulesen, wo das besser funktioniert?
Benutze .NET.

merci&gruss
yves

Dieser Post wurde am 30.03.2006 um 13:56 Uhr von Knief editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.03.2006, 17:51 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi MIDI's sind big-endian, also umgekehrt zu dem was man normal am pc hat (nämlich normal little endian)

Also entweder Hi/Lo-Byte(s) vertauschen nachm lesen, oder erst das niedrigere nd dann das höhere einlesen. kommt im endeffekt aufs selbe raus.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.03.2006, 13:57 Uhr
RHBaum



Direkt machen kannst es selber mit sowas z.b.


C++:
template<T>
T convertEndian(const T & rx)
{
    T treturn = 0;
    const char * pfrom = reinterpret_cast<const char *>(&rx);
    char * pto = reinterpret_cast<char *>(&treturn);
    for(size_t i = 0; i < sizeof(T); ++i )
    {
         pto[sizeof(T)-i]=pfrom[i];
    }
    return treturn;
}



mal vorausgesetzt das char 1 byte gross ist (sagt niemals nie ! ) ^^

Der clou ist eigentlich nur zu wissen das man es machen muss ^^

Deshalb gibt es irgendwie ne einfache moeglichkeit zu checken was man fuern prozessor hat auf compiler ebene ?
der gcc laeuft ja zum beispiel auch mit dem Mac ....

Bei Netzwerkgeschichten nimmt einem das ja das BS ab (htons etc ....) aber bei dateien muss ich es halt selber wissen ....

Ciao ...

Dieser Post wurde am 31.03.2006 um 13:58 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.03.2006, 15:56 Uhr
virtual
Sexiest Bit alive
(Operator)


ntohl ist die Funktion, die das macht, was der Fragesteller braucht. Hat den großen Vorteil, daß sie insoweit protabel ist, daß sie auf Bigendian systemen nix macht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: