Bytes einzeln darstellen??



  • Hallo !

    Ich möchte die 4 Bytes des Long Datentypes in C++ einzeln darstellen.
    Wie kann ich das machen?
    Kann man sie iregnewie einfach auftrennen??
    Gibt es da spezielle Funktionen?
    Oder muss man sich da was schreiben??
    Bitte um hilfe!!!!

    mfg
    steve888



  • long l = 123;
    
    unsigned char *p = reinterpret_cast<unsigned char*>(&l);
    
    for (size_t i = 0; i < sizeof(long); ++i)
    {
    	cout << static_cast<size_t>(p[i]) << endl;
    }
    


  • Oder bitweise:

    template <typename T>
    std::string bit_string(T value)
    {
    	std::string bits;
    
    	for (signed int i = 8*sizeof(value)-1; i >= 0; --i)
    	{
    		bool bit = (value >> i) & 1;
    		bits.push_back(bit ? '1' : '0');
    	}
    
    	return bits;
    }
    

    Anwendung:

    long l = 12345l;
    std::cout << bit_string(l) << std::endl;
    

    Bedenke einfach die Plattformabhängigkeit.


  • Mod

    long int foo=123456789;
    
    unsigned char einzelne_bytes[4]={(foo>>24) & 0xFF,(foo>>16) & 0xFF,(foo>>8) & 0xFF,(foo>>0) & 0xFF};
    


  • Alternativ kannst du auch Unions verwenden, da braucht man nichts selbst zusammenrechnen:

    union kram
    {
    	long lvar;
    	unsigned char bytes[4];
    };
    

    Elemente von Unions beginnen alle bei der Selben Speicheradresse, daher zeigt das chararray nun auf die einzelnen Bytes der longvariablen.



  • Das mit der Union funktioniert zwar in der Praxis, aber laut Standard darf man nur die Variable einer Union lesen die zuletzt geschrieben wurde.



  • Danke Leute.
    Sehr hilfreich von euch!! 🙂
    Werde ich dann gleich probieren...
    Könntet Ihr mir noch einen Tipp geben wo solche elementaren Beispiele und Sachen drinnen stehnen?? 😕
    (Tolle pdf-Files oder Bücher)

    mfg
    steve888



  • Das mit der Union funktioniert zwar in der Praxis, aber laut Standard darf man nur die Variable einer Union lesen die zuletzt geschrieben wurde.

    Das hab ich nicht gewusst, aber verwende Selbst ja auch nie eine Union, aber diese Info schiebt die Wahrscheinlichkeit das Ding zu Nutzen nur noch weiter in die Ferne.
    Hat da vielleicht Jemand besondere Praxiserfahrung mit Unions?
    Diese Dinger teilen sich ja den Selben speicher, ist es da denn überhaupt wahrscheinlich dass eine Verwendung wie ich sie vorgeschlagen habe irgendwo fehlschlägt? Standard hin oder her?
    Ist immerhin "nur" Speicher der irgendwie angesprochen wird.
    Oder sehe ich das jetzt zu einfach?


Anmelden zum Antworten