12. 헤더파싱

Download Report

Transcript 12. 헤더파싱

헤더 파싱
( Header Parsing )
헤더 파싱이란?
 헤더 (Header)
 데이터를 정해진 표준 포맷(Format)으로 저장하여 상
대방이 데이터를 처리할 수 있도록 하는데, 이때 핵심
데이터(core data) 앞 단에 붙여놓은 이를 해석할 수
있는 정보를 헤더라고 한다.
 헤더 파싱
 표준 포맷으로 만들어진 파일에서 핵심 데이터를 뽑
아내기 위해 헤더에서 정보를 읽고 분석하는 과정.
헤더의 필요성
Raw 영상 데이터 파일
 파일의 시작부터 끝까지 영상 픽셀(Pixel) 데이터
 파일만으로는 가로, 세로 크기를 알 수 없어 화면 표시
불가능.
헤더가 포함된 표준 포맷 파일
 헤더에 영상의 가로, 세로 크기 등 화면 표시에 필요한
정보를 포함하여 표준 포맷을 알고 있는 사용자는 누
구든 분석해서 볼 수 있다.
 표준 포맷에 따라 BMP, JPEG 등 여러 파일 포맷 존재
BMP 파일의 구조
File Header
(전체 파일 정보)
Image Info Header
(영상 관련 정보)
Optional Palette
(선택적으로 포함됨)
Image Data
(핵심 데이터)
헤더 파싱 환경
실험 bmp 영상
htc.bmp 480x540
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
 가장 처음의 두 바이트는 매직넘버로, 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
과 Little-Endian방식이 있다.
 Intel x86계열의 CPU가 Little-Endian을 사용하고, 나머지 대부분
의 CPU가 Big-Endian방식을 사용한다.
Big-Endian
 상위 바이트 값(0x0A)이 번지 수가
작은 메모리 (메모리 번지 : a) 상에
먼저 저장되는 방식.
Byte Order
Little-Endian
 상위 바이트 값(0x0A)이 번지 수가
큰 메모리 (메모리 번지 : a+3) 상에
먼저 저장되는 방식.
 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을 사용한다.
 Byte Align 변경
 #pragma pack(1)
: 1B단위로 Byte Align
 실습: sizeof( )로 Byte Align이 바뀌었을 때 구조체의 크기 관찰?
실습
Wav파일의 헤더를 파싱한다.
 Wav파일을 준비한다.
 Wav파일의 포맷 구조 및 Syntax, Semantics를 이해
한다.
 Wav파일 포맷의 필드(field)중 Sample Rate와 Bits
per Sample을 출력한다.
End