본문으로 건너뛰기
AZ Tools

MessagePack 디코더

MessagePack은 JSON은 너무 크고 protobuf는 절차가 과하다고 느낄 때 쓰는 형식입니다. 같은 값을 바이트로 압축해 담죠. 그런데 문제가 생기면 그 압축성이 곧 걸림돌이 됩니다. 캐시나 큐, 로그에서 나온 페이로드를 디코딩 없이는 읽을 수 없으니까요. 이 도구는 형식 전체를 읽고, JSON이라면 잃어버릴 구분을 그대로 유지합니다. 정수는 기록된 폭 그대로 나오고, 자바스크립트 숫자에 담기지 않는 64비트 값은 조용히 반올림하는 대신 문자열로 유지합니다. 바이너리는 텍스트로 뭉개지 않고 바이너리로 남습니다. str과 bin의 구분은 형식이 나온 뒤에 추가된 것이고, 이 둘을 섞는 것이야말로 디코더가 데이터를 망가뜨리는 방식입니다. 확장 타입은 번호와 함께 보여주고, 타임스탬프 확장은 세 가지 인코딩 모두 제대로 해석합니다. 결과는 값마다 타입을 붙인 트리로, 그리고 JSON으로 보여줍니다. JSON이 표현할 수 없는 것들은 뭉뚱그리지 않고 명시합니다. 입력에 값 하나가 쓰는 것보다 많은 바이트가 있으면 — 메시지를 이어붙인 스트림이 그렇게 보입니다 — 남은 바이트 수를 알려줍니다. 없는 척하지 않고요. 업로드되는 것은 없습니다.

base64나 hex로 된 MessagePack 페이로드를 붙여넣으면 디코딩됩니다.

사용법

  1. 페이로드를 base64 또는 hex로 붙여넣으세요. 형식은 자동 감지되고 직접 지정할 수도 있습니다.
  2. 트리를 읽으세요. 각 행에 키, MessagePack 타입, 값이 표시됩니다.
  3. 값을 다른 곳에서 처리하려면 JSON을 복사하세요.
  4. 캡처한 페이로드 파일을 끌어다 놓으면 바로 디코딩됩니다.
  5. 여러 메시지가 이어진 스트림이라면 남은 바이트 안내를 확인하세요.

자주 묻는 질문

str과 bin의 차이는 뭔가요?
MessagePack에는 원래 텍스트와 바이트를 함께 쓰는 raw 타입 하나뿐이었습니다. 2013년 개정에서 UTF-8 텍스트용 str과 임의 바이트용 bin으로 분리됐는데, 그러지 않으면 디코더가 바이트를 텍스트로 해석해야 할지 알 수 없기 때문입니다. bin을 문자열로 다루는 것이 바이너리 데이터가 깨지는 경로라서, 여기서는 둘을 구분해 둡니다.
큰 정수가 왜 JSON에서 문자열로 나오나요?
자바스크립트 숫자는 2^53까지만 정수를 정확히 담습니다. MessagePack은 완전한 64비트 정수를 다루므로, 그 한계를 넘는 값은 JSON 출력에서 문자열로 씁니다. 자릿수가 조용히 사라지는 편이 불편함보다 나쁘니까요.
타임스탬프는 어떻게 해석하나요?
타입 -1인 타임스탬프 확장에는 세 가지 인코딩이 있습니다. 4바이트 초, 12바이트 나노초+초, 그리고 30비트 나노초를 34비트 초 위에 한 워드로 눌러 담은 8바이트 형식입니다. 마지막이 함정으로, 평범한 정수로 읽으면 수만 년 어긋난 날짜가 나옵니다.
남은 바이트 경고는 무슨 뜻인가요?
MessagePack 값은 스스로 경계를 갖기 때문에 한 버퍼에 여러 개가 이어질 수 있습니다. 첫 값이 입력보다 먼저 끝나면 나머지는 대개 또 다른 메시지입니다. 조용히 무시하는 대신 얼마나 남았는지 알려줍니다.
타임스탬프 말고 다른 확장 타입은요?
타입 번호와 base64 페이로드로 보여줍니다. 확장의 의미는 그것을 기록한 애플리케이션이 정하는 것이라, 일반적으로 해석할 대상이 없습니다.
페이로드가 업로드되나요?
아니요. 바이트는 브라우저에서 디코딩되고 서버로 전송되지 않습니다.

관련 도구