Question

Je ne sais pas si c'est correct, je l'ai testé et il me semble que certains octets sont éteint...En gros, j'ai le texte suivant:

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

Quelqu'un aurait-il l'esprit de pointage où je suis allé mal?Je vous remercie.

Était-ce utile?

La solution

Vous êtes réglage nNewValue à l'adresse de szBuffer, au lieu de la lecture des données à partir de cette adresse.Utilisation:

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

Autres conseils

changer cette déclaration

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

à

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

Voici une version modifiée de votre programme qui fonctionne sur mon système (élargi à un programme complet):

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

memcpyde 's les deux premiers paramètres sont de type void*, de sorte que vous n'avez pas besoin de les jeter;si vous ne les jeter (est-ce que la conversion obsolète en C++?), vous devriez fonte à void*, pas char*.

L'affectation à nNewValue convertit le adresse de la mémoire tampon pour long long*, et puis déréférence la valeur convertie.

Mais c'est une mauvaise idée.g++ me donne un avertissement sur le déréférencement de la conversion d'un pointeur:

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

En outre, il n'y a aucune garantie que szBuffer, qui est un tableau de unsigned char, est correctement aligné de sorte que ses premiers octets peuvent en toute sécurité être traitée comme une long long objet.Le x86 ou x86_64 système, vous êtes plus susceptible à l'aide tolère mal alignées les accès à la mémoire, mais pas de tous les systèmes de le faire.

Pointeur de castes sont souvent dangereux, sauf si vous savez exactement ce que vous faites.

Si vous voulez relire le cadre d'un tableau de caractères comme un objet d'un autre type, vous pouvez utiliser un syndicat si vous avez vraiment besoin d'interpréter le mémoire lui-même comme un autre type d'objet, ou de l'utilisation memcpy.(Même si, assurez-vous que vous avez vraiment besoin pour ce faire;il est probable que vous n'avez pas.La plupart du temps, si vous souhaitez stocker un long long objet, vous devez juste définir un long long objet).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top