Domanda

Non sono sicuro che sia corretto, l'ho testato e sembra che alcuni byte siano spenti...Fondamentalmente ho quanto segue:

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

A qualcuno dispiacerebbe indicarmi dove ho sbagliato?Grazie.

È stato utile?

Soluzione

Stai ambientando nNewValue all'indirizzo di szBuffer, invece di leggere i dati da quell'indirizzo.Utilizzo:

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

Altri suggerimenti

Cambia questa affermazione

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

A

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

Ecco una versione modificata del tuo programma che funziona sul mio sistema (esteso a programma completo):

#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";
}

memcpyI primi due parametri sono di tipo void*, quindi non è necessario lanciarli;se li trasmetti (quella conversione è deprecata in C++?), dovresti eseguire il cast to void*, non char*.

L'incarico a nNewValue converte il indirizzo del buffer a long long*, quindi dereferenzia il valore convertito.

Ma questa è una cattiva idea.g++ mi dà un avviso sulla dereferenziazione del puntatore convertito:

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

Inoltre, non vi è alcuna garanzia in merito szBuffer, che è un array di unsigned char, è allineato correttamente in modo che i suoi primi byte possano essere trattati in sicurezza come a long long oggetto.Il sistema x86 o x86_64 che molto probabilmente stai utilizzando tollera accessi alla memoria disallineati, ma non tutti i sistemi lo fanno.

I lanci di puntatori sono spesso pericolosi a meno che tu non lo sappia esattamente cosa stai facendo.

Se vuoi reinterpretare parte di un array di caratteri come un oggetto di altro tipo, puoi usare un'unione se hai davvero bisogno di interpretare la memoria stessa come un diverso tipo di oggetto, oppure usare memcpy.(Anche così, assicurati di averne davvero bisogno;è probabile che tu non lo faccia.Nella maggior parte dei casi, se si desidera archiviare un file long long oggetto, dovresti semplicemente definire UN long long oggetto.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top