2012-07-31 1 views
2

4 바이트 (RegQueryValueEx에 의해 생성됨) 배열을 실제로 가리키는 바이트 포인터가 있습니다.
이 4 바이트를 하나의 DWORD로 변환하려고합니다.
매우 간단하고 확실하게 기존 방법이있는 것처럼 보이지만 찾지 못했습니다.C++에서 DWORD로 4 바이트 변환

다른 방법 : 등록 된 값은 TimeStamp입니다. 4 바이트 배열을 변환하는 메소드가 TimeStamp를 문자열로 나타 냅니까?

답변

1

MAKEWORD MAKELONG 매크로를 살펴보십시오.

3

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 *에 캐스팅하고 역 참조에 의해 기본적으로 작동합니다. 이는 다음과 같은 이식성 문제를 야기하기 때문에 극히 나쁜 것으로 간주됩니다.

  • 엔디 언 (위에서 설명한대로). 서로 다른 프로세서 아키텍처는 단어를 다른 방식으로 저장합니다. 예를 들어 x86 프로세서는 리틀 엔디안이고 PowerPC는 빅 엔디안입니다. 위의 구성은 프로세서가 4 바이트 값을 해석하는 방법에 대한 가정을 만듭니다.
  • 메모리 정렬 문제. 일부 아키텍처에서는 워드 액세스를 정렬해야합니다. 즉, 멀티 바이트 메모리 액세스의 주소는 워드 크기의 배수 여야합니다. 위의 코드는 정렬되지 않은 액세스를 허용하는 x86에서 작동하지만 68000과 같은 다른 아키텍처에서는 버스 오류가 발생할 수 있습니다.
    C의 변수는 해당 크기에 맞게 올바르게 정렬됩니다. 즉, int이 32 비트이면 컴파일러는 대상 시스템에서 32 비트가 필요한 경우 정렬을 보장해야합니다. char[4]은 4 바이트로 정렬되지 않을 수도 있습니다.
+0

나는 그것을 알고 또한 그렇게했다. 하지만 왜 그렇게 간단한 방법이 존재하지 않는지 궁금합니다. – Aharon

+0

DWORD를 BYTE의 동일한 참조로 지정하여 결과를 얻는 방법이 없습니까? (메모리의 복사 유무와 상관없이) – Aharon

+0

기술적으로'char c [4]; int i = * ((int *) c);'그러나 포인터와 같은 종류의 속임수는 대개 나쁜 이유로 간주됩니다. – BenW

관련 문제