Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Header einer Datei richtig ausgeben !

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
11.02.2008, 15:02 Uhr
WindDancer1



Hi zusammen,

ich möchte den Header einer Datei einlesen und wieder auf der Konsole ausgeben und mühe mich schon seit Tagen damit ab !

Ich habe dazu ein kleines Programm geschrieben und alles so gut kommentiert wie es ging.
Teilweise wird der Head jetzt auch richtig ausgelesen (Average heart rate, Number of ECG waveform Data usw.).
Wie sieht das aber aus wenn 2 Werte auf jeweils 2Byte verteilt sind.
Die etsten beiden Byte und somit den 1. Wert kann ich auslesen z.B.:
Average heart rate:

C++:

    //DURCHSCHNITTLICHE (AVERAGE) Herat Rate
    short int DSHeartRate = arrHeader[52]  + (arrHeader[53]);
    cout << "DSHeartRate Rate: " << DSHeartRate << endl << endl;




Das Ergebnis ist 75, was richtig ist !

Wie sieht es aber mit dem 2. Wert aus (Average instantaneous heart rate ???) ?


Zur verdeutlichung ein 2. Beispiel:
MAXIMUM Heart rate ist der erste 2 Byte Wert (Byte 48 und 49),
MINIMUM Heart rate ist der zweite 2 Byte Wert (Byte 50 und 51), die Berschnung des 1. Wertes müsste stimmen, hoffe ich aber der 2.???

C++:

    //MAXIMUM Herat Rate
    short int MAXHeartRate = arrHeader[48] + (arrHeader[49]);
    cout << "MAXHeart Rate: " << MAXHeartRate << endl << endl;

    //MINIMUM Herat Rate
    short int MINHeartRate = arrHeader[50]  + (arrHeader[51] );
    cout << "MINHeartRate Rate: " << MINHeartRate << endl << endl;



Kommt das so hin mit der Bitshifterei bzw. mit dem Fehlen derselben ?

Ich hab selbstverständlich die bereinigte Version nochmal hochgeladen inkl. Schnittstellenbeschreibung :
www.filehosting.at/files/download.php?file=1c133eee8c86bc1220307936b7d07f8b



Vielen, vielen Dank für eure Mühe und Hilfe
Gruß
WinDDancer


P.S.:
Falls Ihr irgendwelche Tuts, Bücher, Skripten, Worshops oder sonstiges Material kennt, die dieses Thema behandeln wäre ich um jeden Link dankbar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.02.2008, 15:29 Uhr
mmc20
puss in boots


hi, wenn du "festes" format hast kommste evtl. besser wenn du dir ein struct baust. zB.:

C++:
struct OHQ_ECG {
    DWORD dwDataVersion;
    WORD wEaaVersion;
    BYTE bReserved1;
    BYTE bDataGraphType;
    DWORD dwStartDateTime;
    DWORD dwECGDataNumber;
    WORD wInputDataLevel;
    WORD wSamplingFrequ;
    // usw...
}


und dann die datei direkt in das struct liest.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.02.2008, 19:14 Uhr
WindDancer1



Hi mmc20,

ja die Sache mit dem Struct stimmt, aber es geht mir erst mal unm das grundsätzliche

Zitat:

Wie sieht es aber mit dem 2. Wert aus (Average instantaneous heart rate ???) ?


Zur verdeutlichung ein 2. Beispiel:
MAXIMUM Heart rate ist der erste 2 Byte Wert (Byte 48 und 49),
MINIMUM Heart rate ist der zweite 2 Byte Wert (Byte 50 und 51), die Berschnung des 1. Wertes müsste stimmen, hoffe ich aber der 2.???
C++:

//MAXIMUM Herat Rate
short int MAXHeartRate = arrHeader[48] + (arrHeader[49]);
cout << "MAXHeart Rate: " << MAXHeartRate << endl << endl;

//MINIMUM Herat Rate
short int MINHeartRate = arrHeader[50] + (arrHeader[51] );
cout << "MINHeartRate Rate: " << MINHeartRate << endl << endl;




Kommt das so hin mit der Bitshifterei bzw. mit dem Fehlen derselben ?

Ich hab selbstverständlich die bereinigte Version nochmal hochgeladen inkl. Schnittstellenbeschreibung :
www.filehosting.at/files/download.php?file=1c133eee8c86bc1220307936b7d07f8b



Wenn ich das verstanden habe (mir jemand erklärt hat) ist ein Struct 1. Wahl.



Vielen Dank für Deine Mühe und Hilfe
ShadowEater
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.02.2008, 15:26 Uhr
mmc20
puss in boots


was genau meinst du mit "bitshifterei" ?
bei deinem beispiel

C++:
short int MINHeartRate = arrHeader[50] + (arrHeader[51] );

seh ich keine, du addierst ja "nur". sicher meinst du so etwas wie:

C++:
WORD MINHeartRate = arrHeader[50] + (arrHeader[51] * 256 );

oder

C++:
WORD MINHeartRate = arrHeader[50] + (arrHeader[51] << 8);

der vorteil an dem struct ist das du dich um die rechnung nicht kümmern musst, dh. in den feldern stehen die werte schon richtig drin.

Dieser Post wurde am 12.02.2008 um 15:28 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.02.2008, 15:37 Uhr
BurningBrain



Wie wärs mit:

C++:
WORD MINHeartRate;
memcpy(&MINHeartRate, &arrHeader[50]);


Damit würdest du dir das ganze geshifte sparen :-D.

Vor allem hast du bei dem Shiften einen Denkfehler, weil, wenn du zum Beispiel die Zahl 0x00FF hast wäre das ja 255. Bei deiner Rechnung mit Byte[0]+Byte[1]*256 aber 0xFE01 = 65025.
Oder habe ich da einen Denkfehler?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.02.2008, 18:30 Uhr
WindDancer1



Hi,

danke für eure Antworten, könntet Ihr beide etwas genauer drauf eingehen was ihr da meint.
@mmc2
Könntest Du mir anhand eines Bsp. Arrays zeigen was Du meinst?


@BurningBrain
...oh Gott wieso kann ich mir dann das geshifte sparen ?


Danke für eure Hilfe & Mühe
Winddancer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.02.2008, 20:28 Uhr
BurningBrain



Sry, war ein Fehler im Code,
richtig wäre:

C++:
WORD MINHeartRate;
memcpy(&MINHeartRate, &arrHeader[50], 2);


Du kopierst 2 Bytes (1 WORD) von der Speicheradresse arrHeader[50] an in den Speicher von MINHeartRate. Damit liegen beide Bytes genauso wie vorher in der Variable MINHeartRate, nur, dass sie jetzt als WORD interpretiert werden und nicht mehr als BYTE.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.02.2008, 16:50 Uhr
mmc20
puss in boots


beschreib mal bitte etwas genauer was dir noch unklar ist.

wenn in deinem array werte sind die als WORD gespeichert sind dann sind das 2 BYTE, also ein WORD setzt sich aus einem LOBYTE und einem HIBYTE zusammen, wichtig zu wissen ist: welches zuerst im array liegt. zb in deinem array an stelle 50 und 51, 50 ist das LOBYTE, 51 das HIBYTE. das heisst du musst das HIBYTE 8bit nach links schieben (oder mit 2^8 multiplizieren, was 256 ist) und dann mit dem LOBYTE addieren.

@BurningBrain
was du mit dem memcopy willst versteh ich auch nicht ganz...
dann könntest du doch gleich das array entsprechend referenzieren

C++:
BYTE arr[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
WORD tmp = *((WORD*)&arr[2]);

in tmp steht dann das WORD von array-position 2 = 0x0804

Dieser Post wurde am 14.02.2008 um 17:09 Uhr von mmc20 editiert.
 
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: