unsigned int* in ein char* casten und wieder zurück



  • moin

    ich möchte ein unsigned int* in ein char* casten und in einer anderen funktion wieder zurück casten...

    wie bekomm ich das hin ??

    thx für hilfe
    LT



  • Entweder mit C-Style-Cast oder reinterpret-cast. Wie hast du's denn versucht? Und warum musst du das überhaupt machen?

    Beispiel:

    int main()
    {
    	unsigned int i=666;
    	unsigned int *pi=&i;
    	char *pc=(char*)pi;
    	unsigned int *pi2=(unsigned int*)pc;
    	std::cout << *pi2;
    
    }
    

  • Mod

    Ach, ich sehe gerade schon, dass ich zu spät bin, da ich zu lange an dem Beispiel geschrieben habe:

    void foo(int * i)
    {
      char *b=reinterpret_cast<char*>(i);
      cout << b << endl;   // AB
    }
    
    int main()
    {
      char* a=new char[3];
      a[0]=65; //'A'
      a[1]=66; //'B'
      a[2]=0;
      foo(reinterpret_cast<int *>(a));
    }
    

    Die Zeigertypen char* und int* sind inkompatibel, da char und int unterschiedliche Größen haben. Daher muss man da mit reinterpret_cast ran. Das Verwenden von reinterpret_cast weist wie so oft darauf hin, dass man Dummheiten vor hat. Und zurecht: Man sollte nicht glauben, dass beim Zugriff auf die Daten über den Zeiger i in meinem Beispiel irgendetwas Definiertes rauskäme. Und ganz bestimmt nicht die 65,66,0 die in das char-Array eingegeben wurden.

    Daher die naheliegende Frage: Warum?



  • SeppJ schrieb:

    Das Verwenden von reinterpret_cast weist wie so oft darauf hin, dass man Dummheiten vor hat.

    Meistens stimmt das, es gibt aber natürlich auch sinnvolle Anwendungen. Beispielsweise ein int-Zeiger, der auf einen Bildpuffer zeigt (um pixelweise durchzuwandern). Der kann durchaus zum char-Zeiger gecastet werden, um auf die einzelnen Kanäle zuzugreifen o.ä.



  • ok thx variante 1 hat funktioniert ...

    um das zu erklären wäre es nötig etwas weiter auszuholen ... und dazu hab ich grad net so die zeit... es geht auf jedenfall darum einen blob in eine oracle datenbank zu speichern ... und das ging bis eben net ... mit dem casten geht es aber ... daher thx ...



  • _matze schrieb:

    Meistens stimmt das, es gibt aber natürlich auch sinnvolle Anwendungen.

    reinterpret_cast wird vor allem im Low-Level-Bereich benötigt. Eine gute Abstraktion macht den Cast oft überflüssig...

    LordTerra schrieb:

    und das ging bis eben net ... mit dem casten geht es aber

    ...was natürlich niemanden daran hindert, reinterpret_cast zum einfachen Umgehen von Compilerfehlern zu benutzen.


Log in to reply