Frage

Ich bin mir nicht sicher, ob das richtig ist, ich habe es getestet und es scheint, dass einige Bytes ausgeschaltet sind...Grundsätzlich habe ich Folgendes:

unsigned char szBuffer[1024] = {0};
long long nValue = 1334553536;
memcpy(szBuffer, (char*)&nValue, sizeof(long long));

//

long long nNewValue = reinterpret_cast<long long>(szBuffer);
printf(nNewValue); //prints out a smaller number than previously stated

Würde es jemandem etwas ausmachen, darauf hinzuweisen, wo ich falsch gelaufen bin?Danke.

War es hilfreich?

Lösung

Du stellst ein nNewValue an die Adresse von szBuffer, anstatt Daten von dieser Adresse zu lesen.Verwenden:

long long nNewValue = *reinterpret_cast<long long*>(szBuffer);

Andere Tipps

Diese Erklärung ändern

long long nNewValue = reinterpret_cast<long long>(szBuffer);

zu

long long nNewValue = *reinterpret_cast<long long *>(szBuffer);

Hier ist eine modifizierte Version Ihres Programms, die funktioniert auf meinem System (erweitert zu einem vollständigen Programm):

#include <iostream>
#include <cstring>
int main() {
    unsigned char szBuffer[1024] = {0};
    long long nValue = 1334553536;
    std::memcpy(szBuffer, &nValue, sizeof(long long));
    long long nNewValue = *(reinterpret_cast<long long*>(&szBuffer));
    std::cout << nValue << "\n" << nNewValue << "\n";
}

memcpydie ersten beiden Parameter sind vom Typ void*, also brauchen Sie sie nicht zu werfen;wenn Sie sie umwandeln (ist diese Konvertierung in C ++ veraltet?), sollten Sie auf casten void*, nicht char*.

Die Zuordnung zu nNewValue konvertiert die Anschrift des Puffers zu long long*, und dereferenziert dann den konvertierten Wert.

Aber das ist eine schlechte Idee.g ++ warnt mich vor der Dereferenzierung des konvertierten Zeigers:

warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

Darüber hinaus gibt es keine Garantie dafür, dass szBuffer, das ist ein Array von unsigned char, ist korrekt ausgerichtet, so dass seine ersten paar Bytes sicher als behandelt werden können long long Objekt.Das x86- oder x86_64-System, das Sie höchstwahrscheinlich verwenden, toleriert falsch ausgerichtete Speicherzugriffe, aber nicht alle Systeme tun dies.

Zeigerabwürfe sind oft unsicher, es sei denn, Sie wissen es genau was du tust.

Wenn Sie einen Teil eines Zeichenarrays als Objekt eines anderen Typs neu interpretieren möchten, können Sie eine union verwenden, wenn Sie den Speicher selbst wirklich als einen anderen Objekttyp interpretieren oder verwenden müssen memcpy.(Stellen Sie trotzdem sicher, dass Sie dies wirklich tun müssen;es ist wahrscheinlich, dass Sie dies nicht tun.Meistens, wenn Sie eine speichern möchten long long objekt, du solltest einfach definieren a long long Objekt.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top