MessagePack 코덱
MessagePack 바이너리 직렬화 형식 인코딩 및 디코딩
API 응답, 로그 파일 또는 네트워크 캡처에서 가져온 MessagePack 데이터 붙여넣기
클릭하여 예제 데이터 삽입
디코드 결과
MessagePack 데이터를 입력하고 디코드를 클릭하면 결과가 표시됩니다
바이트 뷰어
MessagePack으로 인코딩할 유효한 JSON 데이터 입력
컨테이너 길이 인코딩
- Compact: 최소 바이트 사용 (≤15개 요소 시 fixarray/fixmap)
- Explicit 16-bit: 항상 2바이트 길이 사용 (array16/map16 형식)
- Explicit 32-bit: 항상 4바이트 길이 사용 (array32/map32 형식)
클릭하여 JSON 예제 삽입
인코드 결과
JSON 데이터를 입력하고 인코드를 클릭하면 MessagePack이 생성됩니다
바이트 뷰어
인코딩 통계
MessagePack 데이터 타입 참조
| 타입 이름 | 포맷 바이트 범위 | 설명 |
|---|---|---|
| 양수 FixInt | 0x00-0x7F | 0에서 127까지의 정수 (1바이트) |
| 음수 FixInt | 0xE0-0xFF | -32에서 -1까지의 정수 (1바이트) |
| FixMap | 0x80-0x8F | 0-15개의 키-값 쌍을 가진 맵 |
| FixArray | 0x90-0x9F | 0-15개의 요소를 가진 배열 |
| FixStr | 0xA0-0xBF | 0-31 바이트 길이의 문자열 |
| Nil | 0xC0 | null/nil 값을 나타냄 |
| 불리언 | 0xC2-0xC3 | True (0xc3) 또는 False (0xc2) |
| 바이너리 | 0xC4-0xC6 | 원시 바이너리 데이터 (bin8/bin16/bin32) |
| 확장 | 0xC7-0xC9, 0xD4-0xD8 | 타입 코드가 있는 애플리케이션 정의 타입 |
| 부동소수점 | 0xCA-0xCB | 32비트 또는 64비트 부동소수점 수 |
| 부호 없는 정수 | 0xCC-0xCF | 8/16/32/64비트 부호 없는 정수 |
| 부호 있는 정수 | 0xD0-0xD3 | 8/16/32/64비트 부호 있는 정수 |
| 문자열 | 0xD9-0xDB | UTF-8 문자열 (str8/str16/str32) |
| 배열 | 0xDC-0xDD | 16비트 또는 32비트 길이의 배열 |
| 맵 | 0xDE-0xDF | 16비트 또는 32비트 길이의 맵 |
MessagePack 프로토콜 문서
MessagePack이란
MessagePack은 효율적인 데이터 교환을 위해 설계된 바이너리 직렬화 형식입니다. 2008년 Furuhashi Sadayuki가 만들었으며, JSON과 유사한 데이터 구조를 JSON보다 일반적으로 50% 작고 파싱이 더 빠른 컴팩트한 바이너리 표현으로 압축합니다. 이 형식은 성능이 중요한 Redis, Fluentd 및 수많은 실시간 통신 시스템에서 널리 채택되고 있습니다.
바이너리 인코딩 구조
MessagePack은 타입-길이-값 인코딩 체계를 사용합니다. 첫 번째 바이트(포맷 바이트)가 데이터 타입을 결정하며, 작은 정수와 짧은 문자열의 경우 값 자체를 포함할 수 있습니다. 더 큰 값은 길이와 페이로드에 추가 바이트를 사용합니다. 이 설계를 통해 MessagePack은 작은 값을 매우 효율적으로 인코딩하면서도 큰 데이터 구조를 지원할 수 있습니다.
| 포맷 바이트 | 의미 |
|---|---|
| 0x00-0x7F | 양수 fixint (0-127, 바이트 내 값) |
| 0x80-0x8F | Fixmap (0-15쌍, 하위 4비트에 개수) |
| 0x90-0x9F | Fixarray (0-15요소, 하위 4비트에 개수) |
| 0xA0-0xBF | Fixstr (0-31바이트, 하위 5비트에 길이) |
| 0xC0-0xDF | Nil, 불리언, bin, ext, float, int 타입 |
| 0xE0-0xFF | 음수 fixint (-32에서 -1) |
MessagePack vs JSON 비교
두 형식 모두 동일한 데이터 모델을 나타내지만 다른 시나리오에 최적화되어 있습니다. MessagePack은 컴팩트한 크기와 파싱 속도를 우선시하여 고처리량 시스템에 이상적입니다. JSON은 사람의 가독성과 모든 플랫폼에서의 범용 호환성을 우선시합니다.
- JSON보다 30-50% 작음
- 네이티브 바이너리 데이터 지원
- 더 빠른 직렬화 및 파싱
- 구별되는 정수 타입으로 타입 안전
- 사람이 읽고 편집 가능
- 브라우저와 언어의 범용 지원
- 더 쉬운 디버깅 및 로깅
일반적인 용도
- Redis 데이터 직렬화 및 캐싱
- 실시간 통신 프로토콜 (게임, 채팅)
- Fluentd 로그 집계 및 전달
- RPC 프레임워크 (MessagePack-RPC)
- 대역폭 제약이 있는 모바일 및 임베디드 애플리케이션
확장 타입
MessagePack은 애플리케이션 정의 확장 타입을 지원합니다. 각 확장에는 타입 코드(-128에서 127까지의 정수)와 바이너리 페이로드가 있습니다. 일반적인 표준 확장에는 정확한 시간 표현을 위해 초와 나노초를 저장하는 타임스탬프(타입 -1)가 포함됩니다.
| 타입 코드 | 일반적인 용도 |
|---|---|
| -1 | 타임스탬프 (공식) |
| 0-127 | 애플리케이션 정의 타입 |