Win32 - API - Little/Big Endian과 MAKEINTRESOURCE 매크로
[TOC]
엔디안(Endian)
- 컴퓨터 메모리와 같은 1차원의 공간에 연속된 대상을 배열하는 방법
바이트 순서(Byte Order)
- 바이트를 배열하는 방법
- 단위는 바이트
리틀 엔디안
- 최하위 바이트(LSB-Least Significant Byte)부터 저장한다.
- 따라서 작은 단위가 앞에 온다.
- 헥사코드로 표현된 0x1234를 메모리에 저장할 경우
- 단위는 바이트이므로 12, 34 이렇게 2바이트이다.
- 최하위 바이트부터 저장하므로 [34,12] 순서로 저장된다.
빅 엔디안
- 최상위 바이트(MSB-Most Significant Byte)부터 저장한다.
- 따라서 큰 단위가 앞에 온다.(사람이 숫자를 쓰는 방식과 같다)
- 헥사코드로 표현된 0x1234를 메모리에 저장할 경우
- 단위는 바이트이므로 12, 34 이렇게 2바이트이다.
- 최상위 바이트부터 저장하므로 [12,34] 순서로 저장된다.
리틀 엔디안과 빅 엔디안의 차이
| 리틀 엔디안 | 빅 엔디안 |
|---|---|
| Intel 계열의 프로세서가 사용하는 바이트 오더링 | Unix의 RISC 계열의 프로세서가 사용하는 바이트 오더링 |
| 네트워크에서 사용하는 바이트 오더링 | |
| 뒤에서부터 스택에 푸시 | 앞에서부터 스택에 푸시 |
| 계산연산에서 빅 엔디안보다 속도가 빠름 | 비교연산에서 리틀 엔디안보다 속도가 빠름 |
MAKEINTRESOURCE 분석
리소스 아이디
- Win32 프로그래밍에서 리소스를 사용하면 정수값이 부여되는데 이 값이 해당 리소스의 아이디가 된다.
MAKEINTRESOURCE 란?
- Windows는 리소스 지정시 문자열을 사용하는데 리소스 아이디는 문자열 또는 정수형으로 저장된다.
- 문자열로 리소스를 지정하면 바로 사용할 수 있지만 정수형으로 저장된 리소스 아이디를 넘길 시 문자열 형태로 변환시켜야 하는데 이 역할을 하는 매크로 함수가 MAKEINTRESOURCE 이다.
MAKEINTRESOURCE의 원리
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
- 리소스 아이디를 WORD로 형변환 시 2바이트를 넘어가는 비트는 날아간다.
- 따라서 리소스 아이디는 2바이트의 크기(65536)을 넘지 않도록 해야한다.
- 다시 ULONG_PTR 형으로 변환하면 하위 2바이트를 제외한 상위 2바이트는 00이된다.
- 32비트 환경에서 상위 비트는 2바이트
- 64비트 환경에서 상위 비트는 6바이트
- 이를 문자열로 만들기 위해 LPSTR로 형변환하면 리소스 문자열로 넘길 수 있게 된다.
- 이 문자열 포인터를 받은 곳에서 상위비트를 검사하여 00이면 정수형 아이디로 인식하고 리소스 파일에서 실제 값을 찾는다.
- 윈도우는 리틀엔디안을 사용하므로 상위비트가 메모리의 뒤(오른쪽)에 저장된다.
- 문자열은 끝 바이트가 0일 경우(널 터미네이트) 문자의 끝으로 인식하므로 메모리 상에서 정수 아이디 값의 끝 바이트가 0일 경우 문자열과 구분할 수 없다.
- 문자열에서 널 터미네이트 문자만이 0일 수 있기 때문에 끝의 2바이트를 검사해서 00이면 정수 아이디로 하기로 한것이다.
- 윈도우는 리틀엔디안을 사용하므로 상위비트가 메모리의 뒤(오른쪽)에 저장된다.
참고
- 리틀 엔디안 VS 빅 엔디안
- MAKEINTRESOURCE 매크로 분석
- 헥사코드란?