문제

나는 확실하지 않으면 이것은 올바른지,나는 그것을 테스트하고 보이는 몇 가지 바이트다.기본적으로,나는 다음과 같다:

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

고 싶은 마음을 가리키는 어디 갔어?감사합니다.

도움이 되었습니까?

해결책

당신이 설정 nNewValue 주소 szBuffer, 대신에서 데이터를 읽는 주소입니다.를 사용:

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

다른 팁

이 명령문 변경

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

~

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

여기에의 수정된 버전의 프로그램 내 시스템 (확장 완벽한 프로그램):

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

memcpy's 첫번째 두 개의 매개변수의 유형 void*, 는,그래서 당신은 필요가 없는 그들을 캐스팅;만약 당신이 캐스팅(는 변환에 사용하지 않는 C++?), 해야 합 캐스팅 void*, 지 char*.

할당 nNewValue 로 변환합니다 주소 의 버퍼 long long*, 고 다음 역참조와 변환된 값입니다.

그러나 이것은 나쁜 생각이 아니다.g++게 경고에서 역참조의 변환된 포인:

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

또한,는 보장은 없 szBuffer, 는 배열의 unsigned char, 이 올바르게 정렬되어 그 처음 몇 바이트 수를 안전하게 처리 될 것으로 long long 체입니다.X86 또는 x86_64 시스템 가운데 가장 많이 사용을 허용 잘못 세워진 기억에 액세스하지만,모든 시스템니다.

포인터를 캐스팅을 안전하지 않은 자주지 않는 한 당신은 알 정확히 당신은 무슨 일을 하는지입니다.

하려는 경우 재해석의 일부 문자 배열의 일부 다른 형식을 사용할 수 있습니다 연합하는 경우 당신은 정말 필요한 해석하는 메모리 자체로 다른 유형의 객체 사용하거나 memcpy.(그렇지만,확실히 당신이 정말로 필요 이렇게 하;그것을 가능성이 높 당신은하지 않습니다.대부분의 시간을 저장하려는 경우에는 a long long 체,당신은 단지 정의 a long long 체입니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top