최근 수정 시각 : 2025-03-22 17:28:01

파일 시그니처


파일:다른 뜻 아이콘.svg  
#!if 넘어옴1 != null
'''파일 헤더'''{{{#!if 넘어옴2 != null
, ''''''}}}{{{#!if 넘어옴3 != null
, ''''''}}}{{{#!if 넘어옴4 != null
, ''''''}}}{{{#!if 넘어옴5 != null
, ''''''}}}{{{#!if 넘어옴6 != null
, ''''''}}}{{{#!if 넘어옴7 != null
, ''''''}}}{{{#!if 넘어옴8 != null
, ''''''}}}{{{#!if 넘어옴9 != null
, ''''''}}}{{{#!if 넘어옴10 != null
, ''''''}}}은(는) 여기로 연결됩니다. 
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html C 언어에서 사용되는 소스}}}에 대한 내용은 [[헤더 파일]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[헤더 파일#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[헤더 파일#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.

#!if 리스트 != null
{{{#!if 문서명1 != null
 * {{{#!if 설명1 != null
C 언어에서 사용되는 소스: }}}[[헤더 파일]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[헤더 파일#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[헤더 파일#|]] 부분}}}}}}{{{#!if 문서명2 != null
 * {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
 * {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
 * {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
 * {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
 * {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
 * {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
 * {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
 * {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
 * {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}

1. 개요2. 식별자로써3. 목록4. 관련 문서

1. 개요

임의의 데이터가 어떤 형식을 나타내는지 구분하기 위해 파일의 맨 앞부분에 삽입하는 고유한 값. 매직 넘버라고도 불린다.

2. 식별자로써

전통적으로 확장자Windows의 전통으로, 유닉스 계열 운영체제에서는 별도의 확장자 없이 파일 내부에 메타데이터를 포함하는 방식으로 발전했다.[1] 이러한 바이너리 파일 맨 앞부분에 위치한 수~수십 바이트의 내용을 파일 헤더(file header)라고 하는데, 이 파일 헤더 영역의 맨 앞 2바이트를 매직 넘버(magic number)라고 부르며 구분하던 게 시초.[2]

흔히 대중적으로 알려진 파일 구분 방식은 확장자지만, 확장자는 파일 시스템에 저장된 데이터에서만 성립하는 일종의 편의성 습관(convention)이라고 할 수 있다. 유저 인터페이스 아래에서 파일 데이터를 직접 바이트 단위로 읽고 처리하는 대부분의 프로그램들은 파일 시그니처를 사용한다. 파일 매니저에서 확장자와 무관하게 다양한 파일들을 형식별로 동영상, 이미지, 음악 등으로 구분해 주는 원리가 바로 이것.

특히 무명(unnamed) 기반의 시스템에 유리한데, 확장자나 파일명이라는 개념이 없이 모든 데이터를 각각의 바이너리 blob으로 저장하고 이를 해시한 값만을 식별자로 사용한다면?[3] 네트워크로 각종 이미지나 실시간 동영상 같은 데이터를 보낸다면? 이럴 경우 별도의 메타데이터 레이어를 두는 것보다 필요할 때만 파일 시그니처를 읽어서 형식을 알아내는 방식이 효율적이다.

다만 확장자에 비해 비효율적이거나 부정확한 경우도 있는데, 대표적으로 일관성이 없다는 것이다. 확장자야 공백, 특수문자 등이 없는 정규화된 문자열이고 어디부터 어디까지 읽어야 하는지는 명확하지만, 파일 시그니처의 경우 정확히 몇 바이트까지 읽어야 하는지조차 포맷마다 천차만별이다. 또한 바이너리 포맷 위주의 컨벤션이다 보니 파일 헤더란 개념조차 없는 일반 텍스트 파일의 경우에는 적용하기 힘들다.

3. 목록

순서는 시그니처의 바이트 단위로 정렬한다. 길이는 바이트 기준이다. 시그니처는 반드시 대문자 기준 16진법으로 표기한다. 이때, 아무 바이트를 허용한다면 ??로 표시한다. ?? 바이트는 다른 시그니처와 겹치는 경우, 맨 뒤로 정렬한다. 아스키 표현의 경우 출력 불가능한 문자는 .로, 임의의 문자는 ?로 대체한다.
길이 시그니처 아스키 포맷 비고
4 00 00 01 00 .... .ico 파일
4 00 61 73 6D .asm WASM
4 1A 45 DF A3 .E.. MKV WebM도 여기에 포함된다.
2 1F 8B .. gzip 압축 파일
8 21 3C 61 72 63 68 3E 0A !. .deb 패키지 데비안에서 사용된다.
2 23 21 #! 셸 스크립트 #! 문서 참고.
4 25 21 50 53 ..PS 포스트스크립트
5 25 50 44 46 2D %PDF- PDF 이후로는 버전 정보가 온다. 1.7 버전 문서는 %PDF-1.7로 읽히는 식.
6 37 7A BC AF 27 1C 7z..'. 7z
4 38 42 50 53 8BPS PSD
2 42 4D BM BMP
3 42 5A 68 BZh bzip2 압축 파일
5 43 44 30 30 31 CD001 ISO 디스크 이미지
4 43 72 32 34 Cr24 Chrome의 확장 패키지 파일
6 47 49 46 38 37 61 GIF87a GIF 87a 버전 파일
6 47 49 46 38 39 61 GIF89a GIF 89a 버전 파일
4 4B 43 4D 53 KCMS ICC 색 프로파일
3 4B 44 4D KDM VMDK VMware에서 사용된다.
4 4D 53 43 46 MSCF 마이크로소프트 캐비넷 파일
2 4D 5A MZ PE .dll 등이 PE 형식이다.
4 4F 62 6A 01 Obj. Avro 아파치 재단데이터 직렬화 형식
4 4F 67 67 53 OggS Ogg
4 50 4B 03 04 PK.. ZIP zip을 기반으로 하는 거의 모든 컨테이너 파일(apk, docx, epub, jar, xlsx)도 같은 시그니처를 가진다.
8 50 4D 4F 43 43 4D 4F 43 PMOCCMOC DAT
12 52 49 46 46 ?? ?? ?? ?? 57 41 56 45 RIFF????WAVE WAV
12 52 49 46 46 ?? ?? ?? ?? 57 45 42 50 RIFF????WEBP WebP
16 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 SQLite format 3. SQLite의 db 파일
4 54 44 46 24 TDF$ Telegram 데스크탑 파일
2 5A 4D ZM EXE
4 66 4C 61 43 fLaC FLAC
8 66 74 79 70 69 73 6F 6D ftypisom MP4
4 7F 45 4C 46 .ELF ELF .so, .o, 유닉스 네이티브 실행 파일 등 유닉스 운영체제에서 흔하게 볼 수 있다.
8 89 50 4E 47 0D 0A 1A 0A .PNG.... PNG
4 CA FE BA BE .... Java class 임의의 비트열 같겠지만 자세히 보면 Cafe babe가 나온다.
8 D0 CF 11 E0 A1 B1 1A E1 ........ CFBF 흔히 Microsoft에서 개발한 레거시 파일들인 .doc, .xls, .ppt, .msi 등이 여기에 해당한다.
4 ED AB EE DB .... RPM
4 FF D8 FF E0 .... JPG
4 FF D8 FF E1 .... JPG JPEG의 경우 디지털카메라로 캡쳐한 파일과 구분하기 위해 “FF D8 FF E1” 시그니처도 사용
2 FF FB .. MP3
2 FF FE .. 리틀 엔디안 텍스트 파일 BOM 참고
2 FE FF .. 빅 엔디안 텍스트 파일
6 FD 37 7A 58 5A 00 .7zXZ. XZ 압축 파일
12 00 00 00 18 66 74 79 70 68 65 69 63 ????ftyphei HEIC

4. 관련 문서


[1] often associated with Unix and its derivatives, is to store a "magic number" inside the file itself.[2] Originally, this term was used for a specific set of 2-byte identifiers at the beginnings of files[3] Git이 정확히 이렇게 동작한다. 정확히는 유닉스의 파일 시스템을 본뜬 것.