더북(TheBook)

gray_4x4.bmp 파일을 더욱 쉽게 분석하기 위하여 파일의 내용을 그림 3-8과 같이 다양한 색상과 세로선을 이용하여 다시 그려보았다. 맨 처음 노란색 배경으로 쓰여진 부분은 BITMAPFILEHEADER 구조체의 내용이고, 다음의 녹색 배경은 BITMAPINFOHEADER 구조체의 내용이다. 그 다음 분홍색 배경은 색상 테이블 부분이며, 색상 테이블은 1024바이트를 차지하는 긴 구역이기 때문에 중간 부분은 그림에서 생략하였다. 마지막 파란색 부분은 픽셀 데이터가 나타나는 부분이다.

분석을 용이하게 하기 위하여 각 구조체의 멤버들의 바이트 수를 계산하여 해당하는 위치에 각 멤버들의 이름을 적어두었다. 또한 분석을 돕기 위하여 구조체의 멤버 단위, 색상 테이블에서 RGBBYTE 구조체 배열 원소 단위, 픽셀 데이터 부분에서는 한 라인 단위로 세로선을 추가하였다. 그림 3-8에서 두 개의 문자 또는 숫자로 이루어진 수의 표현은 1바이트 크기의 16진수 수를 의미한다.

그림 3-8 gray_4x4.bmp 파일의 16진수 표시

그림 3-8에서 먼저 BITMAPFILEHEADER에 해당하는 부분의 값들을 살펴보자. 파일의 맨 처음 2바이트는 0x42와 0x4D가 나타나는 것을 볼 수 있다. 0x42와 0x4D는 ASCII 코드로 각각 ‘Bʼ와 ‘Mʼ을 나타낸다. 즉, BITMAPFILEHEADER 구조체의 bfType 멤버가 ‘BMʼ이라고 쓰여 있는 것이며, 이는 자기 자신(gray_4x4.bmp)이 BMP 파일임을 나타낸다. bfType 다음의 4바이트 0x46 0x04 0x00 0x00은 bfSize 멤버에 해당한다. Windows 운영체제에서는 리틀 엔디언 방식의 바이트 순서를 사용하기 때문에 bfSize는 16진수 0x00000446을 의미하며, 이를 10진수로 표현하면 1094가 된다. 이는 실제 gray_4x4.bmp 파일의 크기인 1094바이트와 일치하는 값이다. bfReserved1과 bfReserved2는 사용되고 있지 않은 멤버이며 항상 0으로 설정되어 있다. bfOffBits 멤버의 값은 0x36 0x04 0x00 0x00으로 설정되어 있으며, 이를 10진수로 표현하면 1078이다. 이 값은 BITMAPFILEHEADER 구조체의 크기 14와 BITMAPINFOHEADER 구조체의 크기 40, 그리고 색상 테이블의 크기 1024를 합한 값이다.

Note | 바이트 순서(Byte Order)

컴퓨터에서 숫자를 저장하는 방식에는 빅 엔디언(big endian) 방식과 리틀 엔디언(little endian) 방식이 존재한다. 예를 들어 숫자 0x12345678을 메모리에 저장할 때, 빅 엔디언 방식은 0x12, 0x34, 0x56, 0x78의 순서로 저장한다. 반면에 리틀 엔디언 방식은 하위 바이트부터 먼저 저장하여 0x78, 0x56, 0x34, 0x12 순서로 저장한다. 일반적으로 인텔 계열의 CPU에서는 역순으로 저장하는 리틀 엔디언 방식을 따르고 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.