Unsigned char 배열의 캐스팅을 긴[마감]
-
21-12-2019 - |
문제
나는 확실하지 않으면 이것은 올바른지,나는 그것을 테스트하고 보이는 몇 가지 바이트다.기본적으로,나는 다음과 같다:
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
체입니다.)