[#1] Czytanie naglowka pliku WAVE w C
Witam!

Napisalem sobie procedurke ktora odczytuje naglowek pliku WAVE. Wszystko dziala fajnie pod CBuilderem na pececie, ale kiedy chcialem
przerzucic zrodlowke na nasze Amigowe GCC okazalo sie ze program nie dziala jak powinien. Najpierw moze przytocze tresc programu:
#include 
#include 
int main(void)
{

FILE *fp;    // zadeklarowanie pliku

fp = fopen("latwy.wav","rb" );
if (fp)     // gdy udalo sie utworzyc plik...
 {

 char standard[5] = {0}; // tablca char`ow na przechowanie standardu
 char format[5] = {0};

 int *rozmiar_pliku = (int *) malloc (sizeof(int));   // alokacja 4 bajtow na rozmiar pliku

 fread(standard,1,4,fp);  // odczytanie standardu pliku dzw.

   printf("nstandard: %s",standard);
    if (!strcmp(standard,"RIFF" ))  // jesli mamy doczynienia z plikiem WAV
    {
      fread(rozmiar_pliku,4,1,fp);   // odczytanie rozmiaru pliku
       printf("nrozmiar pliku: %d", *rozmiar_pliku);
    }

     fread(format,1,4,fp);   // odczytanie formatu pliku
      printf("nformat pliku: %s",format);

  }

  return 0;

}


... oczywiscie program sie bezproblemowo kompiluje, jednak dziala bardzo dziwnie. Chodzi dokladnie o wartosc jaka wskazuje rozmiar_pliku. Wartosc ta powinna przechowywac calkowita dlugosc pliku (sa to 4 kolejne bajty, ktore odczytuje za pomoca fread). Program odpalony na pececie odczytuje poprawnie dlugosc pliku (np. 88232), a Amiga podaje w tym miejscu cos takiego: -1470627584. Dlaczego tak sie dzieje ? W ogole dlaczego ta liczba jest tak duza i dlaczego jest to liczba ujemna ?

Link do pliku typu WAVE ktory wczytuje (o dlugosci 88232 bajtow) znajduje sie ponizej:

http://andromeda.kul.lublin.pl/~marx/latwy.wav

Z gory dzieki za pomoc!
Pozdrawiam

p.s. program kompiluje w GCC podajac nastepujace parametry: -s -noixemul -o

[#2] Re: Czytanie naglowka pliku WAVE w C

@MarX, post #1

Otóż masz doczynienia z plikiem utworzonym na Little endian, a chcesz go odczytać na Big endian, więc istnieje różnice w formacie zapisu danych patrz: http://pl.wikipedia.org/wiki/Kolejno%C5%9B%C4%87_bajt%C3%B3w
[#3] Re: Czytanie naglowka pliku WAVE w C

@MarX, post #1

Sprawa prosta, są dwa style zapisu liczb większych niż 1 bajt: albo od najstarszego bajtu do najmłodszego (tzw. big endian, procesory między innymi 680x0, PPC), oraz od najmłodszego do najstarszego (tzw. little endian, przede wszystkim procesory x86, ale co ciekawe również np. 6502 przy zapisie adresów). W pliku WAVE stosowany jest little endian, procek x86 ma ten sam, więc wszystko się zgadza. Na Amidze natomiast trzeba odwrócić kolejność bajtów, na przykład tak:

unsigned int dl;

fread(&dl,4,1,fp);
dl = ( dl & << 24 ) | ( dl & 0xff00 << 8 ) | ( dl & 0xff0000 >> 8 ) | ( dl >> 24 );

Swoją drogą alokowanie 4 bajtów na int-a to ekstremalny sport, nie prościej podać adres zmiennej?

[#4] Re: Czytanie naglowka pliku WAVE w C

@MarX, post #1

Takie ładne rysuneczki skopiowane stąd:

0x0050      big-endian                        little-endian
            +------+------+                   +------+------+
            | 1000 | 1001 |                   | 1000 | 1001 |
            +------+------+                   +------+------+
            |  00  |  50  |                   |  50  |  00  |
            +------+------+                   +------+------+

0x7f010203  big-endian                        little-endian
            +------+------+------+------+     +------+------+------+------+
            | 2000 | 2001 | 2002 | 2003 |     | 2000 | 2001 | 2002 | 2003 |
            +------+------+------+------+     +------+------+------+------+
            |  7F  |  01  |  02  |  03  |     |  03  |  02  |  01  |  7F  |
            +------+------+------+------+     +------+------+------+------+


Oczywiście w górnej połówce każdej z tabelek znajduje się adres komórki pamięci, a w dolnej jej wartość.



Ostatnia modyfikacja: 14.05.07 21:11
[#5] Re: Czytanie naglowka pliku WAVE w C

@Grzegorz Kraszewski, post #3

Rzeczywiscie, chodzilo o konwersje wartosci z little endian na big endian. Gdzies slyszalem o tym rozgraniczeniu, ale zupelnie tego nie skojarzylem. Teraz juz chodzi naprawde super! :) Wielkie dzieki chlopaki za szybka (p)odpowiedź. A Tobie Krashan, za gotowy kod do konwersji "w locie". Co prawda musiałem go troche zmodyfikowac aby poprawnie zadzialal (w zapisie wkradlo sie kilka bledow), ale jak sadze pisales ten kod z pamieci wiec absolutnie nie mam zadnych sękow, tylko jeszcze raz dziekuje ;)

Tak to teraz u mnie wyglada

dl = (( dl << 24 ) | (( dl & 0xff00) << 8 ) | (( dl & 0xff0000) >> 8 ) | ( dl >> 24 ));


Pozdrawiam
MarX

[#6] Re: Czytanie naglowka pliku WAVE w C

@DanAdam, post #4

Dlaczego po aktualizacji kodu w części code rozdzieliło mi zawartość nowymi liniami?
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem