헤더 파싱 ( Header Parsing )
헤더 파싱이란? 헤더 (Header) 헤더 파싱 데이터를 정해진 표준 포맷(Format)으로 저장하여 상대방이 데이터를 처리할 수 있도록 하는데, 이때 핵심 데이터(core data) 앞 단에 붙여놓은 이를 해석할 수 있는 정보를 헤더라고 한다. 헤더 파싱 표준 포맷으로 만들어진 파일에서 핵심 데이터를 뽑아내기 위해 헤더에서 정보를 읽고 분석하는 과정.
헤더의 필요성 Raw 영상 데이터 파일 헤더가 포함된 표준 포맷 파일 파일의 시작부터 끝까지 영상 픽셀(Pixel) 데이터 파일만으로는 가로, 세로 크기를 알 수 없어 화면 표시 불가능. 헤더가 포함된 표준 포맷 파일 헤더에 영상의 가로, 세로 크기 등 화면 표시에 필요한 정보를 포함하여 표준 포맷을 알고 있는 사용자는 누구든 분석해서 볼 수 있다. 표준 포맷에 따라 BMP, JPEG 등 여러 파일 포맷 존재
BMP 파일의 구조 File Header (전체 파일 정보) Image Info Header (영상 관련 정보) Optional Palette (선택적으로 포함됨) Image Data (핵심 데이터)
헤더 파싱 환경 실험 bmp 영상 htc.bmp 480x540 Syntax 설명 시 가정 logo.bmp 305x249 Syntax 설명 시 가정 : short : 2B , int : 4B
File Header Syntax struct BITMAPFILEHEADER { unsigned char bfType[2]; unsigned int bfSize; // 파일의 크기 unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; }; // 크기: 14B ( 구조체 Byte Align 무시한 실제 크기 )
File Header semantics bfType : type field bfSize : file size field 가장 처음의 두 바이트는 매직넘버로, B와 M에 해당하는 ASCII값인 0x42, 0x4D가 된다. BMP 파일인지 간단히 확인. bfSize : file size field 그 다음부터 4바이트는 파일의 크기이다. 다만, 리틀 엔디안(little Endian)으로 저장되어 있으므로 0x5ee, 즉 1,518B가 된다.
File Header semantics bfOffBits : offset field 픽셀 데이터의 시작 위치 이다. Offset = 파일 헤더 크기 + Image 정보 헤더 크기 + 팔레트 크기 팔레트가 없는 경우, 파일 헤더의 크기 14바이트와 Image 정보 40바이트의 총 54바이트 다음인 0x36번지부터 픽셀 데이터가 시작된다. 예를 들어, htc.bmp는 리얼 컬러로(픽셀당 비트가 24bit) 팔레트가 필요 없어 offset은 54B가 된다. 예를 들어, logo.bmp는 팔레트 데이터의 크기가 1024B (픽셀당 비트가 8bit로 2ⁿ(n=8) 크기의 팔레트가 필요하여, 256 x 4B = 1024B) 이므로 offset은 54 + 1024 = 1,078B가 된다.
Image Info Header Syntax struct BITMAPINFOHEADER { unsigned int biSize; int biWidth; // 영상의 가로크기 int biHeight; // 영상의 세로크기 unsigned short biPlanes; unsigned short biBitsPixel; ... (next page)
Image Info Header Syntax (cont.) unsigned int biCompression; unsigned int biSizeImage; int biXPelsPerMeter; int biYpelsperMeter; unsigned int biColorUsed; unsigned int biColorImportant; };
Image Info. Header semantics biSize : image info. header size field image info. Header의 크기 : 40B (0x28) biBitsPixel : bits per pixel field 한 화소(Pixel)에 들어가는 비트 수이며, 영상의 색 깊이를 뜻한다. 보통 값은 1, 4, 8, 24이다. 이 파일의 경우는 0x18 = 24비트이다. biCompression : compression type field 압축 방식. 비트맵도 압축 방식이 가능하지만 거의 사용하지 않으며, 값은 0이다.
Image Info. Header semantics biSizeImage : image size field 영상의 크기. 압축되지 않은 비트맵 영상 데이터의 크기로, 파일 크기에서 헤더들을 제외한 크기가 된다. htc.bmp의 경우, 777,600B인데 파일의 크기는 777,654이므로, 54B의 헤더를 제외한 만큼 차이가 난다. biSizeImage = width x height x (픽셀당 비트수/8) 예: 100x100 24bit 100x100x(24/8) = 30000B 단, Image의 가로 크기는 4B단위로 그룹화 (Byte Align) 예: 99x100 24bit 99*3는 297로 4B단위로 나누어지지 않으므로 3B 패딩 즉, 100x100과 SizeImage가 같다.
Optional Palette Syntax struct RGBQUAD { unsigned char rgbBlue; unsigned char rgbGreen; unsigned char rgbRed; unsigned char rgbReserved; }; // 4B
팔레트 정보 팔레트란? 팔레트 크기 및 팔레트 데이터 크기 픽셀당 비트 수가 24bit의 리얼 컬러가 아닌 1, 4, 8bit의 경우, 한정된 색상을 지정해 놓은 색상 테이블(color table)이다. 예를 들어, 1bit인 경우 검정과 흰색 2가지에 대한 테이블이 존재하며, 8bit인 경우 256가지 색상 테이블이 존재한다. 팔레트의 각 색상은 4B로 표현된다. 팔레트 크기 및 팔레트 데이터 크기 예를 들어, logo.bmp의 팔레트 크기는 256 (2ⁿ : 픽셀당 비트 n = 8bit) 이다. 또한, 팔레트 데이터의 크기는 256 x 4B = 1024B가 된다.
영상 데이터 biBitsPixel = 24인 경우 리얼 컬러로 한 픽셀을 표현하기 위해 R, G, B 3바이트가 필요하므로, 3바이트씩 한 픽셀을 표현한다. 다만, 리틀 인디언이므로 BGR의 순으로 저장되어 있다. 또한, BMP파일은 DIB방식에 의거 영상의 상하를 반대로 저장하므로 첫 픽셀의 정보는 그림의 가장 아랫줄 첫 번째 픽셀이 된다.
Byte Order 바이트 순서란 Big-Endian 시스템이 데이터를 메모리 번지에 저장하는 순서로, Big-Endian과 Little-Endian방식이 있다. Intel x86계열의 CPU가 Little-Endian을 사용하고, 나머지 대부분의 CPU가 Big-Endian방식을 사용한다. Big-Endian 상위 바이트 값(0x0A)이 번지 수가 작은 메모리 (메모리 번지 : a) 상에 먼저 저장되는 방식.
Byte Order Little-Endian N/W Byte Order 상위 바이트 값(0x0A)이 번지 수가 먼저 저장되는 방식. N/W Byte Order Byte Order의 차이는 서로 다른 CPU의 호스트간에 통신으로 데이터를 주고 받을 때 보낸 데이터가 뒤집히는 문제가 발생할 수 있다. 이 문제를 해결하기 위해, N/W을 통해 데이터를 전송할 때는 Big-Endian방식으로 통일하기로 약속하였고, 이를 N/W Byte Order라고 한다.
Byte Align 구조체에서 아래 구조체와 같이 char a, int b 순으로 선언되면, b는 1B이지만, 그 다음에 3B에 0으로 더 채워진 후 d가 시작된다. (padding) 왜냐하면 int형은 4의 배수 (int 가 32bit 일 경우) 지점에서 시작하도록 되어 있으며, 이를 Byte Align 이라고 한다. ( double형은 8B이고, 8의 배수지점에서 시작 struct balign { char a; int b; } ;
Byte Align 왜? Byte Align 변경 #pragma pack(1) : 1B단위로 Byte Align 실습: sizeof( )로 Byte Align이 바뀌었을 때 구조체의 크기 관찰?
실 습 Wav파일의 헤더를 파싱한다. Wav파일을 준비한다. Wav파일의 포맷 구조 및 Syntax, Semantics를 이해한다. Wav파일 포맷의 필드(field)중 Sample Rate와 Bits per Sample을 출력한다.
End