kategoria: ANSI C
[#1] [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.
Hej,
zapisałem plik binarny na PC, jakaś duza statyczna struktura za pomocą fwrite po prostu.
Na Amidze tylko char dobrze odczytało, inty były jakieś z kosmosu.
Odwróciłem te wartości bo pewnie chodzi o inną kolejność bitów i było ok.
A używam tego samego kodu na PC i Amidze.

Pytanie, czy znacie jakieś już sprawdzone patenty przy takich konwersjach kodów, portowaniu,
żeby to jakoś automatu zrobić? Jakiś parametr w kompilatorze w GCC na Amidze.
Czy musze robić to jakoś ręcznie robić? Bo kod jest wspólny (platformowo niezalezny),
czy jedynym wyjsciem jest są #ifndef i zrobić warianty?

Najgorzej, że jak odczytuje jakaś duzą strukturę, którą terea złatwo sobie odczytywałem fread po prostu - to teraz muszę każdą wartość odwrócić?

Ostatnia aktualizacja: 07.03.2021 23:34:51 przez mateusz_s
[wyróżniony] [#2] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@mateusz_s, post #1

raczje chodzi ci o kolejność bajtów. Od gcc6 masz możliwość generowania struktur w innym byteendianie
https://stackoverflow.com/questions/41660280/how-to-properly-use-gcc-fsso-struct-for-portable-programs

ps. wlasnie natrafiles na jedną z wielu bolączek przy przerabianiu kodu z x86 na amigę :)
[#3] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@michal_zukowski, post #2

na razie odczyt z pliku binarnego.. to właściwie jedna rzecz w tym momencie,
ale rozumiem że następną byłyby jakieś operacje na konkretnych bitach.
[#4] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@michal_zukowski, post #2

OK, podziałały te pragmy DZIĘKI ! OK
.. po prostu dorzuce je przed strukturami zrobie dorzuce #ifndef i nic sie nie bedzie gryźć

a jeszcze się zastanawiam, jak dam tą informację o zmianie kolejnosci przed strukturą
to to jakoś bedzie wpływać na wydajnosć? czy to bez znaczenia, nie chce zeby czegoś przypadkiem w locie nie zamieniał..

Ostatnia aktualizacja: 08.03.2021 00:01:39 przez mateusz_s
[#5] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@mateusz_s, post #4

pewnie wlasnie w locie zmienia, zawsze mozesz zrobic lustrzane struktury w BE i LE i tych z LE uzywac tylko do operacji dyskowych.
[#6] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@michal_zukowski, post #5

oo to nie dobrze, czyli musze to zmienić potem, przynajmniej widzę że wszystko działa jak należy..
[#7] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@michal_zukowski, post #5

ale przyznam, że to przyjemne uczucie kiedy to program nad ktorym się siedziało na PC, który cos konkretnego rysuje, po raz pierwszy pojawia się na Amidze :D i rysuje dokładnie to samo :D chwila niepewnosci i bach.. odpalił się :)

Kod napisałem w taki sposób, że poza tą kolejnością bitów praktycznie odpalił się bez problemów.. przyjemnie :)

Ostatnia aktualizacja: 08.03.2021 01:24:19 przez mateusz_s
[#8] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@mateusz_s, post #7

Możesz też po prostu konwertować wartości do docelowego trybu kolejności bitów po wczytaniu.
W ten sposób nie musisz mieć oddzielnych wersji funkcji zapisujących.
[#9] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@pisklak, post #8

Ja napiszę w temacie, że w portach gier z PC na Amigę korzystało się z odwracania kolejności bajtów.

Żeby odwrócić kolejność bajtów pomiędzy Little Endian a Big Endian można zaprogramować króciutkie funkcje lub makra w asemblerze 68k, które wywołujemy po odczycie ze struktury lub przed zapisem:

I sprawa załatwiona.

swap_word	macro
	ror.w	#8,d0
	endm

swap_long	macro
	ror.w	#8,d0
	swap	d0
	ror.w	#8,d0
	endm
[#10] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@mateusz_s, post #7

A odnosnie formatu pliku to mozesz dac na poczatku np 4 bajty 0x00000001 i przy ladowaniu sprawdzic wartosc. W ten sposob bedziesz wiedzial w jakim formacie masz plik.
[#11] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@Hexmage960, post #9

W nowszych GCC masz __builtin_bswap32() i __builtin_bswap16() do tego celu. Przenośne, optymalne i bez babrania się w assemblerze.
[#12] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@michal_zukowski, post #2

Należy jednak pamiętać że oznaczenie struktury w taki sposób powoduje, że dane będą trzymane w niej w konkretnym endianie. To oznacza, że o ile fread/fwrite/memcpy po całej strukturze staje się przenośne*, to jeśli wymusiłeś tam little-endian na big-endianowym komputerze, to z każdym dostępem do pól struktury program będzie musiał sobie przeliczyć wartości na natywny endian zanim cokolwiek z nimi dalej zrobi.

Według mnie, lepiej się wysilić trochę i tego jednego fread() zastąpić czytaniem pole po polu + jednorazowe odwracanie endianów w większych polach, żeby potem nie musieć odwracać w głównej pętli gry. A co do gwiazdki - prędzej czy później takie podejście fread/fwrite Ci się i tak wysypie, jak trafisz na to że jedna platforma ma inny alignment niż druga. Tutaj można się posiłkować atrybutem packed, ale to przynosi kolejne klasy problemów, w tym konieczność wyłuskiwania danych wolniej niż zwykły, wyrównany dostęp dostępny dla procesora. A najlepiej, z racji tego że na pececie masz aż nadto mocy obliczeniowej, generować pliki już w big endianie, i wtedy na Amidze nie musisz robić swapa bajtów przy ładowaniu pól.

Ostatnia aktualizacja: 08.03.2021 16:12:00 przez teh_KaiN
[#13] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@teh_KaiN, post #12

Ale po co ma robic ręczną podmiankę bajtów jak definijuje dwie struktury, litttle endian i natywną. Przed zapisem tylko leci po polach i przepisuje odpowiadające sobie pole do pola w dwóch różnych strukturach. Dzieki temu kompilator może to jakoś zoptymalizować. Docelowo skoro program ma byc dla Amigi to i tak bym szedł w zapis plików w bigendianie i wymuszoną konwersje na x86, a nie na Amidze. Po co marnować amigowe zasoby :)
[#14] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@michal_zukowski, post #13

Dzięki za pomoc :)
[#15] Re: [C] Kolejność bitów na różnych platformach, zapis/odczyt pliku binarnego.

@michal_zukowski, post #5

sprawdziłem, że zastosowanie tych:
#pragma scalar_storage_order little-endian

nie wpływa na wydajność programu, fpsy się nie zmieniły,
zostałem przy włąsnych funkcjach i "recznym" zmienianu
bedzie wieksza przenoścność na inne kompilatory w razie czego
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