Odczyt pliku binarnego - przestawione bajty

0

Czesć,
piszę sobie program w którym potrzebuję odczytać wcześniej zapisane dane - zapisuję je do pliku binarnie w ten sposób:

void write(unsigned char *c, const char *filepath, unsigned long long clen) {
        FILE *fp;
        fp = fopen(filepath, "wb");
        if(fp)
            fwrite(c, sizeof(unsigned char), clen, fp);
        else
            printf("Error: Can not write file!.\n");
        fclose(fp);
}

hexdump tego pliku to:

0000000 d5c1 afbe 340b f64f d9cb 2c73 e422 5192
0000010 8d40 cada 0047
0000015

Odczytuję dane przy pomocy tej funkcji:


void read(unsigned char *c, const char *filepath, unsigned long long *clen) {
    FILE *fp;
    fp = fopen(filepath, "rb");
    if(fp){
        fseek(fp, 0L, SEEK_END);
        *clen = ftell(fp);
        *clen = *clen;
        fseek(fp, 0L, SEEK_SET);
        fread(c, sizeof(unsigned char), *clen, fp);
    }
    fclose(fp);
}

Tylko odczytanie danych w ten sposób nie jest poprawine - bajty są poprzestawiane, wypisałem sobie tę tablicę, wygląda tak:

I: 0    Val: c1
I: 1    Val: d5
I: 2    Val: be
I: 3    Val: af
I: 4    Val: b
I: 5    Val: 34
I: 6    Val: 4f
I: 7    Val: f6
I: 8    Val: cb
I: 9    Val: d9
I: 10   Val: 73
I: 11   Val: 2c
I: 12   Val: 22
I: 13   Val: e4
I: 14   Val: 92
I: 15   Val: 51
I: 16   Val: 40
I: 17   Val: 8d
I: 18   Val: da
I: 19   Val: ca
I: 20   Val: 47

Zastanawiam się jak to naprawić, a dane nie wychodzą poza ten sam system/komputer.

2

https://en.m.wikipedia.org/wiki/Endianness czy to przypadkiem ta kolejność nie jest taka bo masz ten a nie inny endianess?

0

Podziel się może swoim kodem do wypisywania tej tablicy, bo mi bardziej wygląda na to, że to on jest błędny, a nie te kawałki kodu co dostarczyłeś.

Btw, *clen = *clen; nie rob nic, a fclose(fp); gdy fp == NULL to jest UB.

0

Dobra, błąd znalazłem sobie, aż mi się śmiać zachciało. Kompilacja pod 32 bity, ale uruchamiane na systemie 64bit. Kompilacja na 64 "naprawiła" choć tak naprawdę wszystko działało.

2

A to nie ten twój hexdump (cokolwiek to za narzędzie) powoduje taki efekt? Bo jeśli wyświetla 16-bitowe słowa, to tak będzie to wyglądać.
Ustaw widok na bajty, to zobaczysz kolejność bajtów.

Kompilacja do 32 czy 64 bitów nie powinna nic tu zmieniać.

Taki widok:

0000010 8d40 cada 0047

mocno sugeruje że kolejność w bajtach jest taka:

0000010 40 8d da ca 47 00

zakładając oczywiście że system jest little-endian, co swoją drogą, jest słuszną kolejnością.

1

Cały problem rozchodzi się o kod którego nie widać.
Kod który wyświetla zawartość tablicy.
Czemu w obu przypadkach używasz innej metody wyświetlania?
Widać to choćby po różnym formatowaniu danych.

Najwyraźniej nie rozumiesz co robią oba sposoby wyświetlania danych i czym się różnią i z tego wynika twoje zmieszanie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.