16진수 편집기란 무엇인가 (그리고 언제 정말로 필요한가)
누군가 “16진수 편집기로 확인해 봐"라고 했거나, 16진수 뷰어를 검색하다가 그게 정확히 무엇인지 확신도 없이 여기 도착했을 것입니다. 괜찮습니다. 16진수 편집기는 파일을 문서, 이미지, 스프레드시트로 해석하려 들지 않고, 그 원시 내용을 바이트 단위로 보여주는 프로그램입니다. 디스크에 실제로 저장된 것을 있는 그대로 들여다보는 데 가장 가까이 다가갈 수 있는 방법입니다.
왜 하필 16진수인가
파일은, 어떤 파일이든, 그저 바이트의 나열이고, 각 바이트는 0부터 255까지의 숫자입니다. 그 숫자를 10진수로 표시할 수도 있지만, 0부터 255는 최대 세 자리를 차지하고 깔끔하게 정렬되지 않습니다. 2진수로 표시할 수도 있지만, 한 바이트는 1과 0으로 된 여덟 자리라 눈으로 훑기 어렵습니다. 16진수(16을 밑으로 하고 숫자 0-9와 문자 A-F를 쓰는 표기)는 그 절충안입니다. 모든 바이트가 정확히 두 글자에, 00부터 FF까지 딱 들어맞아, 한 줄의 바이트가 깔끔하고 훑기 쉬운 그리드로 정렬됩니다. 그것이 10진수도 2진수도 아닌 “16진수"가 표준인 유일한 이유입니다. 기술적 요구가 아니라 가독성 선택입니다.
실제로 보고 있는 것
어떤 파일이든 16진수 편집기에서 열면, 같은 데이터에 대해 나란히 놓인 세 가지를 보게 됩니다:
- 오프셋: 파일 안으로 얼마나 들어왔는지, 보통 16진수 자체로 표시되어, 나중에 특정 위치로 되돌아 이동할 수 있습니다.
- 16진수 바이트: 실제 데이터로, 바이트당 두 글자이며, 여러 줄로 묶입니다(흔히 한 줄에 16바이트).
- 텍스트(ASCII) 뷰: 같은 바이트를 문자로 재해석한 것으로, 파일에서 마침 읽을 수 있는 텍스트인 부분에 한합니다. 텍스트가 아닌 바이트는 보통 점 자리표시자로 나타납니다.
그 세 번째 열이, 대체로 바이너리 데이터인 파일에서도 파일 경로, 라벨, 버전 문자열이 종종 보이는 이유입니다. 임베드된 텍스트는 파일 전체가 텍스트 파일이 아니더라도 그 열에 나타납니다.
언제 정말로 필요한가
대부분의 사람은 평생 16진수 편집기를 한 번도 열지 않으며, 그건 완전히 정상입니다. 그것이 정말로 올바른 도구인 상황은 구체적입니다:
- 파일의 확장자가 실제 내용과 맞지 않을 때. 누군가
.zip을.doc로 이름을 바꿨거나,.db파일이 정말 데이터베이스인지 확신할 수 없을 때. 대부분 포맷의 처음 몇 바이트는 특징적인 시그니처(PNG는89 50 4E 47로, ZIP은50 4B로 시작)라, 16진수 뷰가 몇 초 만에 확인해 줍니다. - 파일이 손상되었고 어떻게 손상됐는지 알고 싶을 때. 잘린 다운로드, 잘못된 전송, 덮어써진 헤더. 원시 바이트를 보면 손상이 처음에 있는지, 끝에 있는지, 흩어져 있는지 알 수 있습니다.
- 바이너리 데이터를 읽거나 쓰는 무언가를 디버깅하며, 세이브 파일 포맷, 설정 파일, 네트워크 프로토콜에서 어떤 바이트가 생성되고 있는지 정확히 확인해야 할 때.
- 특정 값을 검증하고 싶을 때, 이를테면 네 바이트가 정말로 예상하는 파일 크기를 나타내는지 확인하거나, 타임스탬프를 점검하는 것을, 블랙박스 도구가 올바르게 해석하리라 믿지 않고 하고 싶을 때.
- 호기심. 익숙한 파일 포맷이 속으로는 실제로 어떤 모습인지 그저 보려고 16진수 편집기를 한 번 열어 보는 사람도 많습니다. 그건 완전히 정당한 이유입니다.
이 중 어느 것도 여러분이 하는 일에 해당하지 않는다면, 아마 필요하지 않을 것이고, 그래도 괜찮습니다. 특정 종류의 질문을 위한 전문 도구입니다.
그냥 쓸 만한 것을 넘어, 좋은 16진수 편집기를 만드는 것
일단 필요해지면, 도구들은 대체로 같은 기본 일을 합니다. 바이트를 보여주고, 스크롤하게 하고, 검색하게 합니다. 중요한 차이는 원시 기능 개수가 아니라 안전성과 명료함에 관한 것입니다. Hex Fiend는 대부분의 Mac 사용자가 기본으로 정착하게 되는 무료 오픈 소스 선택지이고, 특히 매우 큰 파일에서 정말로 유능합니다. Hexter는 더 좁고 더 신중한 접근을 취합니다. 모든 파일이 읽기 전용으로 열려 낯선 무언가를 들여다봐도 위험이 전혀 없고, 편집은 기본 상태가 아니라 명시적이고 되돌릴 수 있는 단계이며, 흔한 파일 포맷(PNG, ZIP, Mach-O, WAV, SQLite)은 헤더를 손으로 디코딩하도록 남겨 두는 대신 그 구조를 자동으로 파싱해 줍니다.
어느 쪽을 원하는지는 무엇을 하고 있는지에 달렸습니다. 여러 기가바이트짜리 파일 두 개를 바이트 단위로 비교하고 있다면, Hex Fiend의 diff가 그 규모를 위해 만들어졌습니다. 파일이 실제로 무엇인지 확인하거나, 몇 바이트를 점검하거나, 원본을 실수로 망가뜨릴 걱정 없이 작고 신중한 편집을 하기만 하면 된다면, 그것이 바로 Hexter가 만들어진 상황입니다.