Hex to ASCII와 역변환: 개발자를 위한 실용적인 Hex 인코딩 가이드

발행: (2026년 2월 6일 오전 02:13 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

(번역을 진행하려면 번역할 텍스트를 제공해 주시겠어요?)

16진수 기본

16진수(베이스‑16)는 기호 0‑9A‑F를 사용합니다.
각 16진수 자리수는 4비트를 나타내며, 두 자리 16진수는 1바이트(8비트)를 나타냅니다.

십진수16진수이진수
000000
110001
991001
10A1010
11B1011
12C1100
13D1101
14E1110
15F1111

왜 베이스‑16인가? 컴퓨터는 이진수로 동작하고, 16진수는 이진수와 완벽히 매핑됩니다 — 4비트마다 1개의 16진수 자리수가 됩니다. 이는 이진 데이터를 가장 사람이 읽기 쉬운 형태로 표현하는 방법입니다.

ASCII는 각 문자에 번호(0‑127)를 할당합니다. 16진수를 ASCII로 변환한다는 것은 그 번호들을 다시 문자로 변환하는 것을 의미합니다.

Source:

헥스를 ASCII로 변환하고 다시 변환하기

예시 변환

HexDecimalASCII
4872H
65101e
6C108l
6C108l
6F111o

결과: Hello 👋

다른 방향으로 변환하는 것도 마찬가지로 간단합니다:

"Dev" → D(44) e(65) v(76) → 44 65 76

JavaScript

// Hex → ASCII
function hexToAscii(hex) {
  return hex
    .match(/.{1,2}/g)
    .map(byte => String.fromCharCode(parseInt(byte, 16)))
    .join('');
}

// ASCII → Hex
function asciiToHex(str) {
  return Array.from(str)
    .map(char => char.charCodeAt(0).toString(16).padStart(2, '0'))
    .join(' ');
}

console.log(hexToAscii('48656C6C6F')); // "Hello"
console.log(asciiToHex('Hello'));      // "48 65 6c 6c 6f"

Python

# Hex → ASCII
def hex_to_ascii(hex_string):
    return bytes.fromhex(hex_string).decode('ascii')

# ASCII → Hex
def ascii_to_hex(text):
    return ' '.join(f'{ord(c):02x}' for c in text)

print(hex_to_ascii('48656C6C6F'))  # "Hello"
print(ascii_to_hex('Hello'))      # "48 65 6c 6c 6f"

Bash (using xxd and od)

# Hex → ASCII
echo '48656C6C6F' | xxd -r -p
# Output: Hello

# ASCII → Hex (continuous)
echo -n 'Hello' | xxd -p
# Output: 48656c6c6f

# ASCII → Hex (pretty, space‑separated)
echo -n 'Hello' | od -A n -t x1
# Output: 48 65 6c 6c 6f

실용적인 적용

  • 패킷 캡처 (Wireshark, tcpdump)는 페이로드를 16진수로 표시합니다. 덤프에서 ASCII 텍스트를 찾는 것은 기본적인 디버깅 기술입니다:

    0000   47 45 54 20 2f 61 70 69  GET /api
    0008   2f 75 73 65 72 73 20 48  /users H
    0010   54 54 50 2f 31 2e 31     TTP/1.1
  • 웹 색상은 16진수 값입니다:

    color: #FF5733;   /* R:255 G:87 B:51 */
    background: #2D2D2D; /* Dark gray */
  • UTF‑8 인코딩 예시:

    문자UTF‑8 16진수
    éC3 A9
    E2 82 AC
    🔥F0 9F 94 A5
  • 파일 시그니처 (매직 넘버):

    포맷16진수 시그니처
    PNG89 50 4E 47 0D 0A 1A 0A
    JPEGFF D8 FF
    PDF25 50 44 46 (%PDF)
    GIF47 49 46 38 (GIF8)
  • 메모리 주소 (예: 크래시 덤프에서):

    Segfault at address 0x7FFE4B2A1000
    Stack pointer: 0x00007FFEEFBFF5A0

공통 16진수 형식

형식예시일반적인 사용
Space‑separated48 65 6C 6C 6F헥스 덤프, 디버거
No separator48656C6C6FURL, 해시
0x prefix0x48, 0x65C/C++, 메모리 리터럴
\x escape\x48\x65Python, 문자열 리터럴
% prefix%48%65URL 인코딩

ASCII vs. 확장/유니코드

인코딩문자Hex 바이트
ASCIIA41
UTF‑8ñC3 B1
UTF‑8E6 BC A2
UTF‑8🚀F0 9F 9A 80

ASCII는 0‑127(7비트)만 포함합니다. 128‑255 값은 “확장 ASCII”(코드 페이지에 따라 다름)에 해당합니다. 현대 텍스트는 유니코드를 사용하며, 위와 같이 UTF‑8로 인코딩됩니다.

전문가 팁

소문자는 0x61에서 시작하고, 대문자는 0x41에서 시작합니다. 차이는 항상 0x20 (32)입니다. 따라서 대소문자를 전환하는 것은 단순히 한 비트를 뒤집는 것과 같습니다.

Handy Tool

빠르고, 가입이나 추적 없이 브라우저 내에서 변환하려면 hextoascii.co 를 사용해 보세요 – 헥스를 붙여넣고 ASCII를 얻으세요 (그 반대도 가능합니다).

Conclusion

헥스 인코딩은 네트워크 디버깅, 바이너리 분석, 색상 코드, 인코딩 문제 등에서 다시 등장하는 기본적인 기술입니다. 변환 과정을 내면화하면, 생각하지 않아도 헥스 덤프에서 패턴을 인식하게 됩니다.

당신이 겪었던 가장 이상한 헥스‑디버깅 상황은 무엇인가요? 댓글로 공유해 주세요!

Back to Blog

관련 글

더 보기 »

QHexView 5.1 릴리스 (그리고 약간의 역사)

배경: 거의 10년 전, 나는 현재는 휴면 상태인 옛 프로젝트 중 하나의 binary data를 표시하기 위한 작은 widget을 작성하기 시작했습니다. 시간이 지나면서 나는 그 코드를 분리했고...