2014-03-31 26 views
5
error: invalid static_cast from type ‘unsigned char*’ to type ‘uint32_t* {aka unsigned int*}’ 
    uint32_t *starti = static_cast<uint32_t*>(&memory[164]); 

Ich habe ein Array von Zeichen zugewiesen, und ich möchte 4 Bytes als 32bit int lesen, aber ich bekomme einen Compilerfehler. Ich weiß, dass ich etwas verändern kann, wie folgt aus:Kann ich ein unsigned char * in einen unsigned int * umwandeln?

(start[0] << 24) + (start[1] << 16) + (start[2] << 8) + start[3]; 

Und es wird das gleiche tun, aber das ist eine Menge zusätzlicher Arbeit.

Ist es möglich, diese vier Bytes einfach als Int zu interpretieren?

+0

Yup. 'uint32_t val = * (uint32_t *) ((void *) (Speicher + 164));' – IdeaHat

+0

Schauen Sie hier: http://stackoverflow.com/questions/2473628/c-cant-static-cast-from- double-to-int? rq = 1 – Marius

+0

Es sollte angemerkt werden, dass dies nicht sehr 'C++' -y ist. Wenn zum Beispiel "Speicher" aus einer Datei oder aus dem Netzwerk stammt, müssen Sie sich Gedanken über Endianess machen. –

Antwort

8

static_cast ist für "brave" Güsse gedacht, wie double -> int. Sie müssen reinterpret_cast verwenden:

uint32_t *starti = reinterpret_cast<uint32_t*>(&memory[164]); 

Oder, wenn Sie bis zu ihm sind, C-Casts:

uint32_t *starti = (uint32_t*)&memory[164]; 
0

ich BDS2006 C++ verwendet, bin aber trotzdem sollte diese auf anderen Compilern funktionieren

char memory[164]; 
int *p0,*p1,*p2; 
p0=((int*)((void*)(memory))); // p0 starts from start 
p1=((int*)((void*)(memory+64))); // p1 starts from 64th char 
p2=((int*)((void*)(&memory[64]))); // p2 starts from 64th char 
6

Ja, Sie kann einen unsigned char* Zeigerwert zu uint32_t* konvertieren (entweder ein C-Style Cast oder ein reinterpret_cast) - aber das bedeutet nicht, dass Sie das Ergebnis unbedingt verwenden können.

Das Ergebnis einer solchen Konvertierung verweist möglicherweise nicht auf eine Adresse, die ordnungsgemäß ausgerichtet ist, um ein uint32_t Objekt zu enthalten. Zum Beispiel könnte ein unsigned char* auf eine ungerade Adresse zeigen; Wenn uint32_t gleichmäßige Ausrichtung erfordert, haben Sie ein undefiniertes Verhalten, wenn Sie versuchen, das Ergebnis zu dereferenzieren.

Wenn Sie irgendwie garantieren können, dass der unsigned char* zeigt auf eine ordnungsgemäß ausgerichtete Adresse, sollten Sie in Ordnung sein.

+3

Ich würde eine Erklärung für den Downvote schätzen. –

0

Sie können reinterpret_cast wie von Faranwath vorgeschlagen verwenden, aber bitte verstehen Sie das Risiko, diesen Weg zu gehen.

Der Wert dessen, was Sie zurückbekommen, wird in einem kleinen Endian-System vs. einem Big-Endian-System radikal anders sein. Ihre Methode wird in beiden Fällen funktionieren.