§

Options

§

2진수 (기수 2)

§

8진수 (기수 8)

§

10진수 (기수 10)

§

16진수 (기수 16)

§

사용자 정의 기수

KAIST 컴퓨터구조 교과목에서는 IEEE 754 단정밀도 부동소수점을 32비트 패턴으로 분해하는 연습 문제에 진법 변환이 빠지지 않습니다. LG전자 임베디드 펌웨어 팀은 JTAG 프로브로 찍은 16진 덤프를 10진 오프셋으로 변환해 디버거 스크립트에 전달하는 작업을 일상적으로 합니다. ADD 국방과학연구소 연구원들은 군용 통신 메시지의 16진 프로토콜을 역분석할 때 비트 플래그를 2진수로 펼쳐 가며 각 필드의 의미를 확인합니다. 이 도구는 그 산술 과정을 자동화해 해석에 집중하게 합니다.

진법 변환의 원리

모든 위치 기수 체계는 값을 기수의 거듭제곱에 각 자릿수를 곱한 합으로 나타냅니다. 기수를 바꾼다는 것은 같은 값을 다른 거듭제곱 계열로 다시 쓰는 것입니다.

  1. 입력 알파벳 검증. 각 기수는 허용하는 자릿수 집합이 다릅니다. 2진수는 0과 1, 8진수는 0-7, 10진수는 0-9, 16진수는 0-9와 A-F를 허용합니다. 선택한 알파벳 범위를 벗어난 문자가 있으면 변환이 실행되기 전에 인라인 오류가 표시됩니다.
  2. 값 파싱. JavaScript Number 범위(최대 2^53-1)에 맞는 값은 parseInt(text, base)를 사용합니다. 이 범위를 초과하면 BigInt로 전환하여 임의의 큰 정수도 정확하게 변환합니다.
  3. 모든 대상 기수로 재출력. 파싱된 값은 Number.prototype.toString(base) 또는 BigInt.prototype.toString(base)를 통해 각 출력 기수로 변환됩니다. 4개의 표준 패널(2진·8진·10진·16진)과 사용자 정의 기수 패널이 함께 업데이트됩니다.
  4. 서식 적용. 접두사 토글은 2진·8진·16진 출력 앞에 0b, 0o, 0x를 추가합니다. 자릿수 묶음은 2진수 4자리마다, 16진수 2자리마다 밑줄을 삽입합니다. 16진 대소문자 토글로 A-F를 대문자 또는 소문자로 선택합니다.
  5. 실시간 패널 간 동기화. 어느 패널을 편집해도 100 ms 디바운스 재변환이 실행되어 나머지 패널이 업데이트됩니다. 키를 누를 때마다 현재 입력 중인 패널이 진실의 원천으로 취급됩니다.

진법 변환기를 사용하는 이유

  • 메모리 덤프 읽기. 디버거, 역어셈블러, 코어 덤프 뷰어는 주소와 레지스터 값을 16진수로 표시합니다. 이를 10진수로 변환하면 같은 트레이스에서 보고되는 카운트, 크기, 오프셋과 직접 비교할 수 있습니다.
  • 색상 코드 작업. CSS, 디자인 도구, 이미지 형식은 #d2511a와 같은 16진 트리플로 색상을 표현합니다. 각 쌍을 10진수로 변환하면 색상 선택기나 접근성 검사기가 기대하는 rgb(210, 81, 26) 형식으로 바꿀 수 있습니다.
  • 파일 권한 해독. Unix chmod 값은 8진수로 표기됩니다. 755는 각 8진 자릿수를 3개의 2진 비트로 변환하면 rwxr-xr-x가 됩니다. 변환기가 이 매핑을 한 번에 보여 주므로 man 페이지 없이도 권한 설정을 확인할 수 있습니다.
  • 비트 플래그 디버깅. 네트워크 프로토콜, 커널 시스템 콜, 하드웨어 레지스터는 여러 불리언 플래그를 하나의 정수에 묶어 넣습니다. 정수를 2진수로 읽으면 어느 비트가 설정되었는지 한눈에 알 수 있어 플래그가 적용되지 않는 원인을 추적하는 데 유용합니다.

주요 활용 사례

진법 변환은 숫자가 단순한 계수 이상의 의미를 가질 때마다 펌웨어, 보안, 하드웨어 분야의 일상적인 작업에서 등장합니다.

  • 임베디드 펌웨어: JTAG 프로브의 16진 덤프에서 함수 주소를 찾고, 디버거 스크립트가 요구하는 10진 오프셋으로 변환한 뒤 중단점 명령을 작성합니다.
  • 네트워크 보안: 점 분리 10진법으로 출력된 32비트 넷마스크를 2진수로 변환해 프리픽스 길이를 세고, ACL 규칙에 쓸 CIDR 형식을 작성합니다.
  • CTF 퍼즐과 암호 챌린지: 누출된 키 조각을 후보 평문과 XOR으로 비교하면서 16진·10진·2진 사이를 오갑니다.

예시 풀이

10진수 패널에 255를 입력하세요. 16진수 패널은 FF(접두사 토글 켜면 0xFF)로, 2진수 패널은 11111111(묶음 표시 시 1111_1111)로, 8진수 패널은 377로 업데이트됩니다. 사용자 정의 패널의 기수를 36으로 바꾸면 같은 값이 73으로 표시됩니다. 10진수 패널에 123456789012345678901234567890처럼 매우 큰 값을 입력하면 BigInt 경로를 통해 16진수 패널이 18EE90FF6C373E0EE4E3F0AD2로 렌더링됩니다.

FAQ

수의 기수란 무엇인가요?

기수(radix)는 위치 기수 체계에서 다음 자리로 올림이 일어나기 전까지 사용하는 서로 다른 자릿수의 개수입니다. 10진수(기수 10)는 0-9를 사용하고, 2진수(기수 2)는 0과 1만 사용하며, 16진수(기수 16)는 0-9와 A-F를 사용합니다. 기수를 바꿔도 수의 값은 변하지 않습니다 — 자릿수를 쓰고 묶는 방식만 달라집니다.

프로그래밍에서 16진수를 사용하는 이유는 무엇인가요?

16진수 한 자리는 정확히 4개의 2진 비트에 대응하므로, 두 자리가 1바이트, 여덟 자리가 32비트 워드를 나타냅니다. 덕분에 메모리 주소, 레지스터 내용, 색상 트리플, 암호화 키를 가장 압축된 사람이 읽을 수 있는 형식으로 표현할 수 있습니다. 0xFF를 읽는 것이 11111111을 읽는 것보다 빠르고, 필요하면 비트 패턴도 바로 파악할 수 있습니다.

기수 36을 넘어서 변환할 수 있나요?

이 도구는 기수 36을 상한으로 합니다. 이는 0-9와 A-Z를 자릿수 알파벳으로 사용하는 네이티브 JavaScript parseInttoString API의 상한이기 때문입니다. 기수 37-62는 사용자 정의 알파벳으로 구현할 수 있습니다(Bitcoin 주소에 쓰이는 Base58이 그 예입니다). 그러나 더 높은 기수는 각자 고유한 자릿수 순서가 필요해 별도 도구로 분리할 예정입니다.

음수와 부동소수점도 처리하나요?

음의 정수는 Number.prototype.toString과 동일하게 모든 기수에서 앞에 마이너스 부호를 붙여 표시합니다. 선택한 비트 폭(8, 16, 32, 64)에 걸친 2의 보수 표현은 추가 예정인 별도 뷰입니다. 부동소수점 진법 변환은 현재 버전의 범위 밖이며, 이 도구는 정수 값만 처리합니다.

진법 변환은 펌웨어, 보안, 그래픽 작업에서 반복해서 나타나는 작은 작업입니다. Node와 V8이 이미 제공하는 산술 기본 요소를 그대로 쓰는 브라우저 탭에서 처리하므로 빠르고 데이터는 기기 밖으로 나가지 않습니다.