wav header gibt immer null aus (in c)

Gast #1732034
Lesenswert?

Hallo!!! Ich habe da ein Problem mit dem auslesen eines wav headers. Ich 
bekomme da für channelzahl und alles ander auch immer 0 raus. Viellecht 
kann mir ja jemand Helfen. Danke schonmal im voraus.
1
#include <stdio.h>
2
#include <stdlib.h>
3
using namespace std;
4

5
#define DWORD unsigned long
6
#define WORD  unsigned int
7
#define BYTE  unsigned char
8

9

10
struct headerfile
11
  {
12
  char cRIFF[4];            // = "RIFF";        4 Byte
13
      DWORD lP;                 // = 0x00000050;    4 Byte
14
      char  cWaveFmt[8];        // = "WAVEfmt ";    8 Byte
15
      DWORD lUnknown1;          // = 0x00000010;    4 Byte
16
      WORD  wFormatTag;         // = 0x0001;        2 B
17
      WORD  wChannels;          //                  2 B
18
      DWORD lSampleRate;        //                  4 B
19
      DWORD lAvgBytePerSecond;  //                  4 B
20
      WORD  wBlockSize;         //                  2 B
21
      WORD  wBitPerChannel;     //                  2 B
22
      char  cData[4];           // = "data";        4 B   // hier koennte auch was anderes stehen!?!?
23
      DWORD lCountOfSamples;    //                  4 B   // und dann ist das Format hier falsch!
24
    };                          // Summe:          44 Byte
25

26

27

28

29

30
int main()
31
    {
32

33
  FILE*sf;
34
  struct headerfile h;
35

36
  /*open the "wav" file*/
37
  sf = fopen("1.wav","rb");
38
  if (sf == NULL)
39
    {
40
    printf("Fehler beim offnen der Datei!!!");
41
    exit(-1);
42
    }
43
  else
44
    {
45
    printf("Geoffnet\n");
46
    }
47

48
  //fseek(sf,0,SEEK_SET);
49

50
  fwrite(&h,sizeof(h),1,sf);
51

52
  printf(" Hier steht: %i",h.wChannels);
53

54

55

56
  fclose(sf);
57

58
  return 0;
59
    }
(Firma: Schweigstill IT) Persönliche Seite #1732062
Lesenswert?

Die Annahme, dass es sich bei einem int um einen 16Bit-Wert handelt, 
gilt nicht für alle Plattformen, Compiler usw.. Leider wurde hierzu 
keine Angabe gemacht.

Kommt es auf feste Größen der Datentypen an, sollte man entsprechende 
Typen verwenden, wie sie der Compiler anbietet. Bei GCC o.ä. sind dies 
z.B. uint8_t, uint16_t, uint32_t.

Ebenso darf man sich auch nicht darauf verlassen, dass Strukturen immer 
dicht gepackt sind. Ggf. erfolgt ein Padding, insbesondere dann, wenn 
nachfolgende Elemente eine größere Länge besitzen, so dass sie im 
Speicher fehlausgerichtet wären.

Einigen Prozessoren (x86) macht es nicht aus, auf fehlausgerichtete 
Daten zuzugreifen, wohingegen andere (ARM7/9) damit ganz massive 
Probleme haben und (im besten Fall) eine Exception auslösen oder (im 
schlechteren Fall) ungültige Daten lesen/schreiben.

Einige Compiler besitzen Dekoratoren wie z.B. "packed struct" oder 
Pragmas, mit denen man das Padding unterdrücken kann, aber da sollte man 
schon SEHR genau wissen, was man tut, insbesondere wenn das Programm aus 
mehreren Modulen besteht, die anschließend gelinkt werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren