MessagePack 바이너리 크기 계산기
MessagePack으로 정수·문자열·바이너리·배열·맵·확장 타입을 인코딩했을 때 어떤 포맷이 쓰이고 몇 바이트가 되는지 계산합니다.
포맷: uint 16
3바이트
헤더 3바이트
사용 방법
- 1인코딩할 값의 타입을 고릅니다(정수·문자열·바이너리·배열·맵·확장·실수·nil·불리언).
- 2타입에 맞는 값을 넣습니다 — 정수는 값 자체, 문자열·바이너리·확장은 바이트 길이, 배열·맵은 원소·쌍 개수입니다.
- 3어떤 포맷(예: uint 16, fixstr)이 선택되는지와 첫 바이트·전체 바이트 수를 확인합니다.
자주 묻는 질문
같은 값이라도 더 짧게 표현할 수 있으면 그 포맷을 쓰기 때문입니다. 예를 들어 정수 0~127은 헤더 바이트 하나에 값까지 욱여넣는 양의 fixint로 1바이트지만, 128이 되는 순간 uint 8(헤더 1 + 값 1 = 2바이트)로 넘어갑니다. 문자열·바이너리·배열·맵도 길이에 따라 같은 방식으로 fixstr→str8→16→32처럼 단계가 올라갑니다.
이 계산기가 계산하는 건 배열·맵 자체의 헤더(+개수 필드)뿐이기 때문입니다. 원소 5개짜리 배열이라도 각 원소가 정수인지 문자열인지에 따라 원소마다 바이트 수가 다르므로, 원소 각각을 이 계산기로 따로 구해 헤더 바이트에 더해야 전체 크기가 나옵니다.
헤더를 구성하는 규칙 자체가 다릅니다. CBOR은 헤더 1바이트를 주요타입(3비트)+추가정보(5비트)로 나누는 반면, MessagePack은 타입마다 고유한 첫 바이트 값이 표에 그대로 정해져 있습니다(예: nil=0xc0, true=0xc3). dev/cbor-wire-format에서 CBOR 쪽을 계산할 수 있습니다.
값이 0 이상(양수)이면 부호 없는(unsigned) 계열을 먼저 쓰기 때문입니다. int 8은 값이 음수(-128~-1)일 때만 등장합니다. 반대로 -33처럼 음의 fixint(-32~-1) 범위를 벗어난 음수는 int 8로 갑니다. 대부분의 MessagePack 구현체가 이렇게 부호에 따라 계열을 나눠 가장 짧은 포맷을 고릅니다.
MessagePack에는 문자열의 fixstr 같은 "길이 없이 헤더에 바로 담는" 짧은 바이너리 포맷이 없기 때문입니다. bin 8이 가장 작은 바이너리 포맷이라 1바이트를 담아도 헤더 1 + 길이필드 1 + 데이터 1 = 3바이트가 됩니다.
알아두면 좋은 점
- 값의 크기에서 가장 짧은 포맷을 고르는 것은 스펙이 강제하는 규칙이 아니라 사실상 모든 구현체가 따르는 관례입니다. 극히 드물게 이 관례를 따르지 않는 인코더를 만나면 실제 바이트 수가 다를 수 있습니다.
- 정수는 −2⁶³ ~ 2⁶⁴−1 범위만 다룹니다. 이 범위를 벗어나는 값은 MessagePack 표준 정수 포맷으로 표현할 수 없습니다.
- 배열·맵 결과는 헤더까지만이며, 원소 자체의 바이트는 포함하지 않습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 10일 · 결과는 참고용 추정치입니다.