Uczę się wyściełania i pakowania struktury w C. Mam tę wątpliwość, ponieważ przeczytałem dopełnienie zależy od architektury, więc ma wpływ na komunikację między maszynami ?, tj. jeśli dane utworzone na jednym komputerze są odczytywane na innym komputerze. Jak uniknąć tego problemu w tym scenariuszu.Wykładanie struktury
Odpowiedz
#pragma pack
jest obsługiwany przez większość kompilatorów, które znam. To może pozwolić programiście na określenie pożądanej metody wypełniania dla struktur.
http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx
http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html
http://clang.llvm.org/docs/UsersManual.html#microsoft-extensions
Tak, nie można wysyłać dane binarne o strukturze pomiędzy platformami i oczekiwać, że wyglądają tak samo po drugiej stronie.
Sposób, w jaki to rozwiązujesz, to stworzenie marshallera/demarshallera dla twojego konstruktu i przekazanie go w drodze z jednego systemu i po drodze do drugiego systemu. Pozwala to kompilatorowi zająć się buforowaniem w każdym systemie.
Każda ze stron wie, jak pobrać dane, tak jak to określiłeś, i wysłać je na lokalną platformę.
Platformy takie jak Java obsługują to za Ciebie, tworząc mechanizmy serializacji dla twoich zajęć. W języku C musisz to zrobić samodzielnie. Sposób, w jaki to robisz, zależy od tego, w jaki sposób chcesz wysłać swoje dane. Możesz serializować do binarnego, XML lub cokolwiek innego.
Będzie to miało wpływ tylko wtedy, gdy kod skompilowany dla innej architektury używa innego schematu dopełnienia.
W celu złagodzenia problemów zalecam pakowanie struktur bez wypełnienia. Tam, gdzie wymagane jest wypełnienie, użyj uchwytów na place (np. char reserved[2]
). Ponadto nie używaj bitfieldów !! Nie są przenośne.
Należy również pamiętać o innych problemach związanych z architekturą. W szczególności endianness i rozmiary typów danych. Jeśli potrzebujesz lepszej przenośności, możesz serializować i dekompilować strumień bajtów zamiast przesyłać go jako struct
.
Możesz użyć #pragma pack (1) przed deklaracją struct i #pragma pack() przed wyłączeniem pakowania opartego na architekturze; rozwiąże to połowę problemu, ponieważ niektóre typy danych są oparte na architekturze, aby rozwiązać drugą połowę, zwykle używam określonego typu danych, takiego jak int_16 dla 16 bitów całkowitych, u_int_32 dla 32 bitów całkowitych i tak dalej.
Spójrz na http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/netinet/ip_icmp.h.html; to obejmuje opis niektórych sieciowych pakietów danych niezależnych od architektury.
W języku C/C++ jako pakiet danych używane są struktury. Nie zapewnia on enkapsulacji danych ani funkcji ukrywania danych (przypadek C++ jest wyjątkiem ze względu na jego semantyczne podobieństwo do klas).
Ze względu na wymagania dotyczące dopasowania różnych typów danych każdy element struktury powinien być naturalnie wyrównany. Członkowie struktury przyznali kolejno rosnący porządek.
- 1. Wykładanie pola tekstowego
- 2. Wykładanie macierzy w Pythonie
- 3. Wykładanie wierszy w TCPDF MultiCell
- 4. Wykładanie wymagane dla wyrównania w bajtach
- 5. Wykładanie tekstowe w systemie Android między wierszami
- 6. Odczytywanie struktury w obrębie struktury za pomocą funkcji rozpakowywania PHP
- 7. Jak mogę ograniczyć czas istnienia struktury do struktury "nadrzędnej"?
- 8. C: Dokonywanie głębokiej kopii struktury ... robienie płytkiej kopii struktury
- 9. Użyj doxygen do dokumentowania elementów struktury c poza definicją struktury
- 10. Dlaczego nie mogę nawiązywać inicjacji struktury pochodnej innej struktury?
- 11. Konstrukcja struktury danych FSM
- 12. Struktury danych C#
- 13. Głęboka kopia struktury wykresu
- 14. Wewnętrzne struktury jQuery
- 15. samodzielna definicja struktury odwołań?
- 16. JavaScript Struktury IoC/DI
- 17. JSDoc: Zwróć obiekt struktury
- 18. Jak posortować tablicę struktury
- 19. Przegląd struktury projektu Grails
- 20. Gdzie zadeklarować struktury itp.?
- 21. Konfigurowanie struktury aplikacji EF
- 22. Zaktualizuj obiekty struktury encji
- 23. Serializacja struktury danych Clojure
- 24. Malloc tablica wewnątrz struktury
- 25. Tabela struktury organizacyjnej CSS
- 26. Const self-referencyjne struktury
- 27. Inicjalizacja struktury w C++
- 28. Wizualizacja struktury białka
- 29. Nieznany błąd struktury sigaction
- 30. Tworzenie struktury Cocoa
To prawda, ale bardzo myląca w kontekście komunikacji w sieci lub udostępniania plików na różnych platformach. –
Tak, można zmienić dopełnienie konstrukcji. ** To może być niebezpieczne.** Niektóre interfejsy API wymagają odpowiedniego wyrównania danych. Zmiana wypełnienia może zrujnować to. – Anthony
I zmiana dopełnienia struktury nie wystarczy, aby dane były interpretowane tak samo na różnych komputerach. Istnieje wiele innych zagadnień, takich jak reprezentacja liczb swobodnych/podwójnych, reprezentowane liczby całkowite ze znakiem, jaka jest kolejność bajtów w liczbach całkowitych, jaka jest wielkość typu danych ('char',' int', 'long',' long long'?), i stosy więcej. – Anthony