Die bytes eines Integer bekommen



  • </Exit> schrieb:

    Nachdem das nicht so einfach scheint,

    Mit "einfach" hat das nichts zu tun. Es ist super einfach, die Bytes (falls es mehrere sind) eines int s zu vertauschen. Nur ist das nicht wirklich das, was Du tun solltest.

    </Exit> schrieb:

    Den reinterpret_cast find ich nicht sehr schön, außerdem hör ich ständig, dass man sowas nicht benutzen sollte...

    🙂

    </Exit> schrieb:

    Bleibt nur noch die Frage wie ich den int wieder zurück bekomme?

    inline void write_32le(u32least value, unsigned char* out) {
      out[0] = (unsigned char) value;
      out[1] = (unsigned char)(value >>  8);
      out[2] = (unsigned char)(value >> 16);
      out[3] = (unsigned char)(value >> 24);
    }
    

    </Exit> schrieb:

    Und kann ich das mit shiften eigentlich auch lösen, wenn ich nicht weiß ob der int 4 byte hat? (bei lesen weiß ich's, aber beim schreiben ja nicht!)
    (ist ja nicht vorgeschrieben, wie groß der int ist...)

    *seufz*
    Denk da nochmal drüber nach, was Du willst. Wie Du aus einer mehrbittigen Zahl eine Bytefolge bestimmst, die abgespeichert werden soll, hängt doch wohl von dem Dateiformat ab. Das Wegschreiben ist doch genau das Gegenstück zum Lesen. Warum soll das anders sein? Und wenn Du Zahlen lesen/schreiben können willst, die mehr Bits für die Darstellung benötigen als das, was int bietet, dann nimmst Du eben long. Guck Dir dazu nochmal an, wie ich zum typedef für u32least gekommen bin. Das ist der Typ, den Du nutzen solltest, wenn Du vorzeichelose Ganzzahlen mit mindestens 32 Bit benötigst .... nicht int . Ein int ist nur mindestens 16 Bit groß, siehe Integer Types in C and C++.



  • Den reinterpret_cast find ich nicht sehr schön, außerdem hör ich ständig, dass man sowas nicht benutzen sollte...
    

    Der schönste Cast von allen!
    Der Compiler hält die Klappe und macht einfach 😃



  • </Exit> schrieb:

    Den reinterpret_cast find ich nicht sehr schön, außerdem hör ich ständig, dass man sowas nicht benutzen sollte...

    Der reinterpret_cast sieht nicht schön aus, richtig. Und das soll er auch nicht, schließlich ist das was du da machst nichts gewöhnliches sondern eine absichliche Frickelei die am Typsystem von C++ komplett vorbei geht. Damit ist die rote Flagge, die durch das unschöne aussehn gesetzt wird, völlig berechigt und auch gut so, damits niemand einfach überlesen kann.
    Und man sollte es im Normalfall nciht benutzen. Es sei denn man begeht irgendwelche nichtportablen Frickeleien die am Typsystem von C++ vorbeigehn, da ist der Cast-Operator genau das richtige Instrument für.



  • ok, thx, jetzt dürfte alles klar sein 😉



  • Übrigens soll nur niemand auf die Idee kommen, C- und Function-Style-Casts seien "schöner". Auch wenn sie im Code sehr unscheinbar auftreten, sind sie die unsichersten (da sie die Funktionalität von static_cast , const_cast und reinterpret_cast vereinen).

    (unsigned char*)var; // C-Style
    unsigned char*(var); // Funktions-Style
    

  • Mod

    unsigned char*(var); // Funktions-Style
    

    ist eine Deklaration, kein Cast.



  • Tatsächlich, vielen Dank für den Hinweis. Ich bin mir die Klammern bei Deklarationen nicht gewohnt.

    Wie kann man eigentlich einen Funktionsstyle-Cast mit unsigned char* als Zieltyp durchführen? Also ohne typedef . Das Folgende ist doch ein C-Cast, oder?

    unsigned char* ptr = (unsigned char*)(var);
    

    Spielt zwar keine Rolle, aber würde mich an dieser Stelle noch interessieren. Das geht ja wegen des Sternchens nicht:

    unsigned char* ptr = unsigned char*(var);
    

  • Mod

    Nexus schrieb:

    Tatsächlich, vielen Dank für den Hinweis. Ich bin mir die Klammern bei Deklarationen nicht gewohnt.

    Wie kann man eigentlich einen Funktionsstyle-Cast mit unsigned char* als Zieltyp durchführen? Also ohne typedef .

    Kann man nicht. Ein solcher Cast benötigt immer einen einfachen Typbezeichner.



  • camper schrieb:

    Kann man nicht. Ein solcher Cast benötigt immer einen einfachen Typbezeichner.

    Okay, danke vielmals.

    Ich sehe immer wieder, dass es in eigentlich grundlegenden Gebieten von C++ Dinge gibt, welche ich nicht im Detail kenne (hier zum Beispiel, weil ich praktisch nie Function-Style-Casts einsetze). Irgendwie gefällt mir dieser Aspekt von C++. 😉



  • Nexus schrieb:

    Ich sehe immer wieder, dass es in eigentlich grundlegenden Gebieten von C++ Dinge gibt, welche ich nicht im Detail kenne ...

    Ich denke auf konkrete Fragen kann niemand alle Details einfach aus dem Hut schütteln.

    Man hat höchstens eine Ahnung und sieht dann im Standard nach (in diesem Fall §5.2.3). Würde mich schon schwer wundern, wenn jemand über 700 Seiten kryptische Definitionen auswendig könnte. Falls doch, kann er sonst nicht viele Aufgaben haben. 🙂


Anmelden zum Antworten