logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C++] Rzutowanie reinterpret_cast zmienia endian na big-endian

iluvathar 02 Mar 2012 14:59 1194 3
REKLAMA
  • #1 10623583
    iluvathar
    Poziom 10  
    Posty: 23
    Pomógł: 1
    Witam wszystkich
    Próbuje zapisać dane wygenerowane przez program do pliku ale podczas rzutowania za pomocą reinterpret_cast wskaźnika na prostą strukturę, przykładowo:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    na wskaźnik typu char*, rezultat rzutowania ma zmieniony endian na big-endian, co jest bardzo dziwnym zachowaniem.

    Zamieszczam poniżej prosty kod który był testowany pod Qt Creatorze 2.4.0 oraz MS Visula 2008 i w obydwóch środowiskach zachowanie jest identyczne.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jak mi wiadomo mój procek operuje na little-endianie, dlatego prosił o odpowiedzenie na kilka pytań:
    Co może być przyczyną takiego zachowania podczas rzutowania za pomocą operatora reinterpret_cast przy rzutowaniu wskaźnika na strukturę na wskaźnik char*?

    Czy funkcja isBigEndian() może zwracać błędny wynik? Zaznaczam że funkcja isBigEndian() zwraca w obydwóch środowiskach wartość false.

    Pracuje na laptopie marki Acer model Aspire 5740, OS Windows 7 i Qt Creator 2.4.0, procesor Intel®Core™i3 330M (2.13 GHz, 3MB L3 cache).[/code]
  • REKLAMA
  • Pomocny post
    #2 10628650
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Faktycznie dziwne. :D
    Program wyświetla
    Cytat:
    0
    1
    V
    A
    I







    Skoro u Ciebie jest inaczej, to chyba masz jakąś edycję specjalną kompilatora. :P

    Dodano po 7 [minuty]:

    W programie tworzysz niepotrzebnie tablicę, której nie zwalniasz.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Dlaczego niepotrzebnie? Bo to
    Kod: text
    Zaloguj się, aby zobaczyć kod
    nie jest skopiowaniem struktury, tylko przypisaniem wskaźnikowi adresu struktury.
  • REKLAMA
  • Pomocny post
    #3 10629745
    beluosus
    Poziom 25  
    Posty: 362
    Pomógł: 123
    Ocena: 18
    Tu nic się nie dzieje przy reinterpret_cast<> - ta konstrukcja nie narzuca żadnych dodatkowych operacji. Całą magię wykonuje static_cast<>, w ogóle pierwszy raz spotkałem się z taką formą. W sensie (jak to stwierdził kompilator) "multi-character character constant". Ten znak po prostu jest traktowany jak liczba. Więc zgodnie z konwencją little endian np 0x11223344 w pamięci będzie widziane jako 44 33 22 11. Nie mam pojęcia co zamierzasz zrobić w tym kodzie, ale to wygląda bardzo źle. Już pomijając nawet to co wspomniał @LED5W.
  • #4 10632746
    iluvathar
    Poziom 10  
    Posty: 23
    Pomógł: 1
    Kod: text
    Zaloguj się, aby zobaczyć kod


    To mój błąd na siłę chciałem potraktować łańcuch znaków 'IAV1' jako typ całkowity, w rzeczywistości do struktury przypisuje wartość 0x49415631. Skorzystałem z tej notacji, gdyż wydawało mi się to bardziej czytelne w jakiej postaci ma wyglądać wartość którą chcę zapisać do pliku.

    Zaznaczam że miał to być jak najprostszy przykład przedstawiający zaistniałą sytuację, pisany po wielu godzinach kombinacji i szukania rozwiązania tej zagadki.

    Właśnie przegrzebałem wartości nagłówka bitmapy, żeby sprawdzić czy faktycznie tak są kodowane wartości w przypadku Little-endian w plikach jak wspomniał użytkownik beluosus. I muszę przyznać się do błędu, uważając że coś jest nie tak przy rzutowaniu operatorem reinterpret_cast na mojej maszynie. Wszystko wynikało z mojego zaskoczenia otrzymywanych rezultatów, iż nie pokusiłem się o stwierdzenie że wynik zapisu jest w 100% poprawny w szczególności po kliku dobrych godzinach szukania rozwiązania w sieci problemu, który w ogóle nie istniał :D.

    Dziękuję serdecznie za pomoc w zrozumieniu gdzie tkwił problem :!:
REKLAMA