4 바이트 (RegQueryValueEx에 의해 생성됨) 배열을 실제로 가리키는 바이트 포인터가 있습니다.
이 4 바이트를 하나의 DWORD로 변환하려고합니다.
매우 간단하고 확실하게 기존 방법이있는 것처럼 보이지만 찾지 못했습니다.C++에서 DWORD로 4 바이트 변환
다른 방법 : 등록 된 값은 TimeStamp입니다. 4 바이트 배열을 변환하는 메소드가 TimeStamp를 문자열로 나타 냅니까?
4 바이트 (RegQueryValueEx에 의해 생성됨) 배열을 실제로 가리키는 바이트 포인터가 있습니다.
이 4 바이트를 하나의 DWORD로 변환하려고합니다.
매우 간단하고 확실하게 기존 방법이있는 것처럼 보이지만 찾지 못했습니다.C++에서 DWORD로 4 바이트 변환
다른 방법 : 등록 된 값은 TimeStamp입니다. 4 바이트 배열을 변환하는 메소드가 TimeStamp를 문자열로 나타 냅니까?
MAKEWORD MAKELONG 매크로를 살펴보십시오.
4 바이트 배열을 32 비트 값으로 변환하는 방법에 대해 묻고 싶습니다. 맞습니까? 그것은 (당신이 비트 연산자를 고려 가정하는 것은 간단합니다) 실제로 매우 간단합니다
는typedef unsigned int dword;
typedef unsigned char byte;
//Convert an array of four bytes into a 32-bit integer.
dword getDwordFromBytes(byte *b)
{
return (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
}
이것은 당신의 정수 리틀 엔디안을 저장 가정합니다. 즉, 최하위 바이트가 먼저 저장되므로 0x1234라는 단어가 있으면 0x34, 0x12의 두 바이트로 메모리에 저장됩니다.
빅 엔디안에서 숫자 0x1234는 메모리에 0x12, 0x34로 저장됩니다. 원하는 경우 배열 색인을 역순으로 바꾸십시오. 즉 b[3]
에서 b[0]
으로 이동하십시오.
함정 경고 :이
다음 코드는 C 완벽하게 합법적이다, 즉이 오류없이 컴파일 :
char c[4];
int x = *((int *)c);
그러나, 이것은 char *
int *
에 캐스팅하고 역 참조에 의해 기본적으로 작동합니다. 이는 다음과 같은 이식성 문제를 야기하기 때문에 극히 나쁜 것으로 간주됩니다.
int
이 32 비트이면 컴파일러는 대상 시스템에서 32 비트가 필요한 경우 정렬을 보장해야합니다. char[4]
은 4 바이트로 정렬되지 않을 수도 있습니다.
나는 그것을 알고 또한 그렇게했다. 하지만 왜 그렇게 간단한 방법이 존재하지 않는지 궁금합니다. – Aharon
DWORD를 BYTE의 동일한 참조로 지정하여 결과를 얻는 방법이 없습니까? (메모리의 복사 유무와 상관없이) – Aharon
기술적으로'char c [4]; int i = * ((int *) c);'그러나 포인터와 같은 종류의 속임수는 대개 나쁜 이유로 간주됩니다. – BenW