Pobieranie danych

0

Witam mam problem z którym nie moge sobie poradzić. Problem jest bardziej ogólny niz to przedstawie, ale rozwiązanie tej konkretnej sprawy rozwiąże wszystko.
Powiedzmy, że musze pobierać z pliku binarnego dane, które czasami mogą miec 2 bajty czasami 4 czasami 1.
W tym przypadku moje dane będa miały 2 bajty. Plik jest zapisany jako little-endian.
Musze te dane wczytywać do tablicy 4 bajtowych int32_t

void read_file(int32_t *tablica_danych, char* plik)
{
	FILE* f_pt = NULL;
	f_pt = fopen(plik, "rb");
	if (f_pt == NULL)
	{
		printf("Blad wczytania pliku\n");
	}
	else
	{
		int32_t ilosc_danych;// Te dane maja jak jakas wartosc powidezmy 1000 próbek
		int32_t rozmiar_danych; // W tym przypadku 2(bajty)
		char* buffor = malloc(rozmiar_danych * sizeof(char));
		for (int i = 0; i <ilosc_danych; ++i)
		{

			tablica_danych[i] = 0;
			fread(buffor, rozmiar_danych, 1, f_pt);
			tablica_danych[i] = buffor[0] | (buffor[1] << 8);
		}
		fclose(f_pt);
	}
}

I kawałek danych wczytuje się poprawnie, ale potem jest bardzo mała różnica na bajtach i nie wiem skad sie ona bierze. Patrzyłem na hex edytorze z tego co widze niektóre bajty różnią się tylko o 1, a spora czesc jest poprawna.

Nie mam pojęcia co sie dzieje, bo np jak podmienie pętle na cos takiego:

int16_t=test
	for (int i = 0; i < data->n_size; ++i)
		{

			data->samples[i] = 0;
			fread(&test, data->sample_size, 1, f_pt);
			data->samples[i] = test;
		}

Wtedy działa to idealnie, ale nie moge założyć, że moje dane będa miały dwa bajty. Mogą mieć maksymalnie 4. Najbardziej mnie dziwi jak blisko są te dane do bycia poprawnymi.
Prosze o pomoc, bo siedzę nad tym od paru h.

0

Na ślepo nieco, ale pytanie czy problem jest w samym odczycie czy konwersji. Najsampierw bym chyba zmienił char na unsigned char, ew. porownywał bufor z wartością końcową.

0

Masz rację, dziękuję.
Czy moje rozwiązanie problemu jest akceptowalne,czy da się zrobić to lepiej?
Bo teraz robię to tak, że mam buffor

 unsigned char buffor=malloc(rozmiar_danych*(sizeof(unsigned char));

mam zmienną chwilową

int16_t test
test = buffor[0] | (buffor[1] << 8);
tablica_danych[i] = test;

Teraz wszystko mi się zgadza. Robię tak, ponieważ w momencie zmieniania bufora na int32_t mialem tylko wartosci dodatnie, a int16_t może być w moim przypadku ujemny.
Czy da się to zrobić jakos lepiej bez używania zmiennej chwilowej?

1 użytkowników online, w tym zalogowanych: 0, gości: 1