2010-12-16 14 views
1

Ich habe eine Adresse oder einen Zeiger auf ein Objekt.Wie konvertiert man die Zeigeradresse in ein vorzeichenloses char-Array?

Wie konvertiere ich die Adresse in unsigned Char-Array? Ich benutze es als eine Referenz für den Transport mit Sockets. Vielen Dank.

+1

Die Adresse oder der Zeiger ?? – Lockhead

+0

Ich benutze beide, danke. –

+0

Es hat keinen Sinn, eine Adresse über einen Socket zu transportieren. Bitte klären Sie Ihre Frage. Was genau musst du transportieren? –

Antwort

2
Object * pObject = ...; 
unsigned char * pSz = reinterpret_cast<unsigned char *>(pObject); 
// thru pSz you can see your object blindly as a pointer of unsigned char 
// (the first char is pointed) 

//and only if you know the size of your object (sizeObject) you can do this: 
unsigned char pArray[sizeObject] = pSz; 

wirklich Seien Sie vorsichtig, wenn Sie jemals Polymorphismus verwenden, vererbte Objekte haben können völlig Größen als es Mutter Klasse Object differents;

+0

Danke, wonach ich gesucht habe, aber gibt es einen besseren Weg, diese Dinge zu tun? –

+0

@Kaizoku, sollten Sie genauer sein. Transportierst du nur einen Typ, ich meine nur eine Klasse? Wenn ja, können Sie dies tun, es ist in Ordnung. Wenn nicht, ich meine, wenn Sie Objekte unterschiedlicher Größe, unterschiedlicher Endklasse (Objektdämmerern) transportieren, dann sollten Sie wirklich eine wirklich richtige Art der Binär- oder XML-Serialisierung in Betracht ziehen. –

+0

Ich entwerfe Protokoll. etwas wie 0x123123 "tu stuff" 0x313131, aber es wird alles in Byte-Array sein, mit Sonderzeichen als Begrenzer. –

1
void *your_pointer; 
unsigned char *new_pointer = (unsigned char*) your_pointer; 

Da Ihre Frage C++ markiert ist, kann ich auch vorschlagen, dass Sie nicht konvertieren Zeiger herum, aber versuchen, einige High-Level-Bibliothek statt mit? Qt bietet einen exzellenten Rahmen für Sockets und Boost wahrscheinlich auch.

+0

Ich brauche sehr optimierten Code wie möglich und lerne auch selbst, wie ich mitfahre. Die Verwendung einer Bibliothek bietet diese nicht, aber ich schaue sie mir als Referenz an, danke. –

+0

Optimierung ist oft überbewertet. In 99% der Fälle ist es besser, schnell lesbaren Code auf Kosten der Leistung zu schreiben. Später können Sie Engpässe erkennen und beheben, aber in den frühen Entwicklungsstadien werden Sie wahrscheinlich Engpässe sehen, wo sie nicht existieren und die echten übersehen. – Septagram

2

Wenn der Typ völlig unabhängig sind (was sie anscheinend sind), benötigen Sie wahrscheinlich eine reinterpret_cast.

+0

Danke für den Vorschlag, ich werde mir diese ansehen. –

1
unsigned char *array = reinterpret_cast<unsigned char*>(my_obj); 

Allerdings sollten Sie Ihre Objekte nicht einfach senden, indem Sie sie als Byte-Array behandeln. Da sind einige Daten, wie Methodenadressen, die nach dem Senden über das Netzwerk nutzlos sind.

+0

Ich brauche nur Referenz auf der Client-Seite, so dass es einige Befehle an den Server zurücksenden kann. Vielleicht eine Nachschlagsache, ich bin neu in Steckdosen, hast du irgendwelche Empfehlungen? –

+0

Was meinen Sie als Referenz? Wenn Sie möchten, dass der Client einige Änderungen auf dem Server erstellt, sollten Sie wahrscheinlich eine Art Protokoll entwickeln. Wenn Sie nur eine Const-Size-Struktur senden möchten, deklarieren Sie eine (einfach nur Felder) und konvertieren Sie wie in meiner Antwort. Netzwerkdaten sollten jedoch in Netzwerkreihenfolge gesendet werden, da im Allgemeinen nicht sichergestellt werden kann, dass die Architektur auf der anderen Seite dieselbe ist wie Ihre (weitere Informationen finden Sie in den Handbüchern zu htons/ntohs-Funktionen). – x13n

+0

Ich lerne immer noch, ich werde diese Funktionen auch betrachten, danke. –

-2
void* ptr; // Could be any type of course 
ptr = something(); 
int n = sizeof(ptr); 
unsigned char arr = new unsigned char[n]; 
memcpy((void*)arr[0], (void*)ptr, n); 
// Remember to delete [] the array 
+0

Wird das überhaupt kompilieren? Was ist ptr [0] wenn ptr ungültig ist? –

+0

sizeof() wird in der Kompilierungszeit berechnet, und in diesem Fall ist es nur sizeof (void *). – x13n

+1

-1, dein Code hat so viele Fehler, was zur Hölle denkst du passiert, wenn du einen Zeigerwert auf einen 'unsigned char' und zurück wirfst? –

Verwandte Themen