Skip to content

16진수 문자열 변환기 (문자열 → 16진수도 지원)

16진수 문자열 변환 온라인 도구. 0x·\x 표기, xxd·hexdump 출력, 바이트 배열을 붙여넣으면 ASCII·UTF-8·GBK·UTF-16을 자동 판별합니다. 브라우저에서만 처리.

트래킹 없음 브라우저 실행 무료
변환은 모두 브라우저 안에서 이루어집니다. 붙여넣은 내용은 이 기기를 벗어나지 않습니다.
예제 입력

인식한 형식: 일반 16진수 · 13바이트

    텍스트
    Hello, 世界

    자동 판별 결과 UTF-8: 모든 멀티바이트 시퀀스가 올바른 형식입니다.

    같은 바이트를 인코딩별로 읽은 결과

    인코딩 해석 결과
    UTF-8 정상 디코딩 Hello, 世界
    GBK / GB18030 정상 디코딩 Hello, 涓栫晫
    UTF-16LE 디코딩할 수 없는 바이트 있음 效汬Ɐ隸闧�
    UTF-16BE 디코딩할 수 없는 바이트 있음 䡥汬漬⃤뢖�
    ISO-8859-1 정상 디코딩 Hello, ä¸<96>ç<95><8C>
    여기 인용한 16진수 덤프, 바이트 배열, 오류 메시지는 xxd, Python 3.14, Node.js 26, Go 1.27, clang을 실제로 실행해 얻은 것이며, 엔진의 각 출력 형식은 원래 바이트로 다시 읽히는지 테스트합니다. Java와 PHP의 동작은 공식 문서를 인용했습니다. — Go Tools 엔지니어링 팀 · Sep 16, 2026

    Go Tools 인코딩 도구를 개발하는 엔지니어가 작성하고 검토했습니다. 이 페이지에 인용한 모든 16진수 값과 출력은 페이지 자체 엔진이 생성했으며 자동화 테스트로 확인합니다.

    16진수 ASCII 변환 빠른 답변

    48 65 6C 6C 6F를 텍스트로 변환하면 무엇인가요?

    Hello ASCII와 UTF-8에서 48은 H, 65는 e, 6C는 l, 6F는 o입니다.

    중국어 한자 한 글자는 몇 바이트인가요?

    UTF-8은 보통 3바이트, GBK는 2바이트 你는 UTF-8에서 E4 BD A0, GBK에서 C4 E3입니다.

    0D 0A는 무엇인가요?

    CR LF(\r\n) 캐리지 리턴 뒤에 라인 피드가 오는 조합으로, Windows, HTTP, 대부분의 시리얼 명령 체계에서 쓰는 줄 끝입니다.

    문자 A는 16진수로 얼마인가요?

    41 소문자 a는 61이며, 대소문자는 항상 20만큼 차이 납니다.

    16진수 문자열 변환이란?

    16진수는 바이트를 적는 방법입니다. 0부터 255까지의 각 바이트를 00부터 FF까지 두 자리로 씁니다. 16진수 문자열 변환은 이 바이트를 다시 읽을 수 있는 텍스트로 되돌리는 작업이며, 여기에는 항상 문자 인코딩 선택이 따릅니다. 문자 인코딩이란 어떤 바이트 또는 바이트 시퀀스가 어떤 문자를 뜻하는지 정한 표입니다.

    영어 텍스트에서는 이 선택이 좀처럼 드러나지 않습니다. ASCII, UTF-8, GBK를 비롯한 대부분의 인코딩이 00부터 7F까지의 바이트에 대해 같은 규칙을 쓰기 때문입니다. 그 밖의 문자에서는 곧바로 차이가 납니다. 바이트 C4 E3 BA C3은 GBK에서는 你好이지만 UTF-8에서는 올바르지 않고, UTF-8의 你好는 E4 BD A0 E5 A5 BD입니다. 16진수는 정보의 절반일 뿐이고, 나머지 절반은 인코딩입니다.

    문자열을 16진수로 변환하는 것은 그 반대입니다. 텍스트를 바이트로 인코딩한 다음 각 바이트를 16진수 두 자리로 적습니다. 개발자는 이를 이용해 시리얼 회선이나 데이터베이스 칼럼에 실제로 무엇이 오가는지 확인하고, 바이너리 데이터를 소스 코드에 넣고, 두 시스템이 실제로 보낸 내용을 비교합니다.

    $ echo 48656c6c6f | xxd -r -p
    Hello
    
    >>> bytes.fromhex('c4e3bac3').decode('gbk')
    '你好'
    >>> bytes.fromhex('c4e3bac3').decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

    이 16진수 변환기의 기능

    어떤 형식의 16진수든 붙여넣기

    공백 구분, 붙여 쓴 형태, 콜론·하이픈 구분, 0x 값, \x 이스케이프, % 인코딩, C·Go·Java 배열, Java의 부호 있는 Arrays.toString 출력, Python bytes 리터럴, Node.js Buffer, 그리고 xxd, hexdump -C, od 화면 출력 전체까지 처리합니다. 무엇을 인식했고 무엇을 제거했는지 페이지가 알려 줍니다.

    인코딩 자동 판별과 그 근거

    자동 판별은 BOM, 올바른 UTF-8, UTF-16, 순수 ASCII, 마지막으로 GBK 순서로 확인하고 어떤 규칙으로 결정했는지 알려 줍니다. GBK는 바이트가 자주 쓰이는 중국어 문자로 읽힐 때만 선택하므로, 짧은 바이너리 프레임은 엉뚱한 중국어 대신 「텍스트가 아닐 가능성이 높음」으로 표시됩니다.

    모든 인코딩을 나란히 비교

    같은 바이트를 UTF-8, GBK, UTF-16LE, UTF-16BE, ISO-8859-1로 보여 주고, 각각 깔끔하게 디코딩되는지 표시합니다. 텍스트가 깨져 나오면 올바른 해석은 대개 바로 아래 행에 있습니다.

    보이지 않는 바이트를 눈에 보이게

    NUL, CR, LF, ESC 같은 제어 바이트를 ␀ ␍ ␊ ␛로 표시하므로 프로토콜 데이터 끝에 붙은 00이나 빠진 0D가 바로 눈에 띕니다. 복사하면 여전히 실제 문자가 복사됩니다.

    코드에 바로 붙여넣을 수 있는 출력

    텍스트 → 16진수는 공백 구분 또는 붙여 쓴 16진수, 0x 목록, \x 이스케이프, xxd -i 스타일의 C 배열, 부호 있는 값을 쓰는 Java byte[], repr()과 같은 형태의 Python bytes 리터럴, Go []byte, xxd 덤프를 출력하며, 이 페이지는 이 형식을 모두 다시 읽어 들일 수 있습니다.

    데이터가 브라우저를 벗어나지 않음

    파싱과 디코딩은 로컬에서 JavaScript로 실행됩니다. 업로드, 저장, URL 기록이 전혀 없으므로 패킷 캡처나 운영 로그도 안심하고 붙여넣을 수 있습니다.

    코드에서 16진수를 문자열로 변환

    Python 3

    bytes.fromhex(h).decode()

    bytes.fromhex('48 65 6c 6c 6f').decode('utf-8')'Hello'를 반환합니다. 바이트 사이의 공백은 허용되지만 0x 접두사는 허용되지 않습니다. 반대 방향은 s.encode('utf-8').hex()이며, 공백 구분 출력은 .hex(' ')입니다. GBK 중국어 텍스트를 디코딩하거나 인코딩하려면 'gbk'를 넘기세요.

    JavaScript (Node.js)

    Buffer.from(h, 'hex')

    Buffer.from(h, 'hex').toString('utf8')로 디코딩하고 Buffer.from(s, 'utf8').toString('hex')로 인코딩합니다. 잘못된 입력이어도 오류가 나지 않습니다. 디코딩은 첫 번째 잘못된 쌍에서 멈추고 끝의 홀수 자리는 버려지므로 먼저 유효성 검사를 하세요.

    JavaScript (브라우저)

    TextDecoder / TextEncoder

    parseInt(pair, 16)로 두 자리씩 파싱해 Uint8Array에 담은 뒤 new TextDecoder('utf-8').decode(bytes)를 호출합니다. TextDecoder'gbk', 'big5', 'shift_jis'도 읽을 수 있지만 TextEncoder는 UTF-8만 출력합니다.

    Java 17+

    HexFormat.of()

    new String(HexFormat.of().parseHex(h), StandardCharsets.UTF_8)로 디코딩하고 HexFormat.of().formatHex(s.getBytes(StandardCharsets.UTF_8))로 인코딩합니다. 이전 버전에서는 각 바이트를 String.format("%02x", b)로 포매팅하세요. 음수 바이트를 ffffffe4로 출력하는 Integer.toHexString(b)는 피하세요.

    Go

    encoding/hex

    hex.DecodeString(h)는 바이트를 반환하고 string(b)로 문자열이 되며, hex.EncodeToString([]byte(s))로 되돌립니다. 검사가 엄격해서 공백이 있으면 invalid byte: U+0020 ' ', 길이가 홀수면 odd length hex string을 반환합니다.

    C

    sscanf with %2hhx

    문자열을 두 자리씩 순회하며 unsigned char 버퍼에 읽어 들이고 종료 문자 '\0'을 붙입니다. 16진수로 출력할 때는 unsigned char로 캐스트한 뒤 %02X를 쓰세요. 그렇지 않으면 char가 부호 있는 환경에서 0x7F보다 큰 바이트가 FFFFFFE4처럼 출력될 수 있습니다.

    PHP

    hex2bin() / bin2hex()

    hex2bin('48656c6c6f')Hello를, bin2hex('Hello')48656c6c6f를 반환합니다. 매뉴얼에는 길이가 홀수이거나 올바르지 않은 입력에 대해 hex2bin()E_WARNING과 함께 false를 반환한다고 명시되어 있습니다.

    셸 (xxd)

    xxd -r -p / xxd -p

    echo 48656c6c6f | xxd -r -p는 Hello를 출력하고, printf 'Hello' | xxd -p48656c6c6f를 출력합니다. 인코딩할 때는 echo 대신 printf를 쓰세요. echo는 끝에 줄바꿈 0a를 덧붙이기 때문입니다.

    C# (.NET 5+)

    Convert.FromHexString()

    Encoding.UTF8.GetString(Convert.FromHexString(h))로 디코딩하고 Convert.ToHexString(Encoding.UTF8.GetBytes(s))로 인코딩합니다(대문자, 구분자 없음). FromHexString은 공백과 0x 접두사를 허용하지 않습니다. .NET Core와 .NET 5 이상에는 GBK가 들어 있지 않으므로, 먼저 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)를 호출한 다음 Encoding.GetEncoding(936)을 사용하세요.

    16진수 문자열 변환 예제

    중국어 문자가 포함된 UTF-8 16진수

    48 65 6C 6C 6F 2C 20 E4 B8 96 E7 95 8C
    Hello, 世界

    처음 7바이트는 평범한 ASCII입니다. 48 65 6C 6C 6F는 Hello, 2C는 쉼표, 20은 공백입니다. E4 B8 96E7 95 8C는 世와 界를 나타내는 3바이트 UTF-8 시퀀스로, 중국어 한자는 대부분 UTF-8에서 3바이트를 차지합니다. 모든 시퀀스가 올바른 형식이므로 자동 판별은 UTF-8로 읽습니다.

    UTF-8로는 올바르지 않은 GBK 센서 값

    CE C2 B6 C8 3A 32 35 2E 33 A1 E6
    温度:25.3℃

    많은 시리얼 장치가 중국어 텍스트를 GBK로 보냅니다. 여기서 CE C2는 温, B6 C8은 度, 3A 32 35 2E 33은 ASCII :25.3, A1 E6은 전각 ℃ 기호로, 중국어 문자나 기호 하나가 2바이트입니다. UTF-8로 읽으면 이 바이트는 올바르지 않고(CE는 2바이트 시퀀스의 시작이지만 C2는 연속 바이트가 아닙니다), GBK로 읽으면 자주 쓰이는 문자가 되므로 자동 판별은 GBK를 고릅니다. UTF-8만 아는 변환기라면 여기에 대체 문자만 늘어놓습니다.

    xxd 출력을 그대로 붙여넣기

    00000000: 4869 20e4 bda0 e5a5 bd0d 0a              Hi ........
    Hi 你好␍␊

    printf 'Hi 你好\r\n' | xxd가 출력하는 내용 그대로입니다. 디코딩하기 전에 오프셋 00000000:과 오른쪽 문자 표시 열을 제거합니다. 이것을 데이터로 읽으면 0 여덟 개만으로도 맨 앞에 NUL 바이트 4개가 생깁니다. 마지막 두 바이트 0d 0a는 Windows 줄바꿈이며 ␍␊로 표시됩니다.

    로그에 찍힌 Java 바이트 배열

    [-28, -72, -83, -26, -106, -121]
    中文

    Arrays.toString(bytes)는 Java의 부호 있는 바이트를 10진수로 출력합니다. 음수는 0x80 이상인 바이트이며, -28은 256 − 28 = 228 = 0xE4입니다. 6바이트 E4 B8 AD E6 96 87은 中文의 UTF-8 인코딩입니다.

    시리얼 AT 명령을 텍스트에서 16진수로 변환

    AT+CSQ\r\n
    41 54 2B 43 53 51 0D 0A

    모뎀과 대부분의 UART 명령 체계는 모든 명령이 캐리지 리턴과 라인 피드로 끝나야 합니다. 텍스트 입력란에서 Enter를 누르면 0A만 들어가므로 줄바꿈을 CR LF로 옵션을 체크해야 줄 끝이 0D 0A가 됩니다.

    두 번 16진수로 인코딩된 데이터

    653462646130653561356264
    e4bda0e5a5bd → 你好

    여기서는 모든 바이트가 ASCII 16진수 숫자입니다(65는 e, 34는 4, 62는 b). 그래서 첫 번째 디코딩 결과도 또 하나의 16진수 문자열입니다. 16진수 문자열을 텍스트로 취급해 한 번 더 변환하면 생기는 일입니다. 이 페이지는 두 번째 디코딩을 제안하며, 그 결과는 你好입니다. 오탐을 피하기 위해 첫 번째 결과가 16진수 12자리 이상이고 두 번째 결과가 실제 텍스트로 디코딩될 때만 제안합니다. 날짜, 타임스탬프, CRC32 값, MD5 해시로는 발동하지 않습니다.

    16진수를 문자열로 변환하는 방법

    1. 1

      16진수 붙여넣기

      「16진수 → 텍스트」 탭의 입력란에 가지고 있는 형식 그대로 붙여넣으세요. 공백 구분, 붙여 쓴 형태, 0x 값, \x 이스케이프, 바이트 배열, xxd 화면 출력 전체 모두 됩니다. 입력란 아래에 어떤 형식으로 읽었는지 표시됩니다.

    2. 2

      텍스트와 인코딩 확인

      오른쪽에 텍스트가 나타나고, 자동 판별한 인코딩과 그 근거가 함께 표시됩니다. 추측이 틀렸다면 아래 표에서 모든 해석을 확인하고 「인코딩」 메뉴에서 올바른 것을 고르세요.

    3. 3

      보이지 않는 문자 살펴보기

      NUL, CR, LF 같은 제어 바이트는 ␀ ␍ ␊로 표시됩니다. 「보이지 않는 문자 표시」 체크를 해제해 원래 텍스트를 본 다음 결과를 복사하세요.

    4. 4

      또는 텍스트를 16진수로 변환

      「텍스트 → 16진수」 탭에서 인코딩과 출력 형식을 고르세요. 공백으로 구분한 16진수, 0x 값, C·Java·Python·Go 배열, xxd 덤프 중에서 선택할 수 있습니다. 시리얼 통신이나 네트워크 프로토콜용이라면 CR LF를 체크하세요.

    16진수 문자열 변환이 잘못되는 이유

    GBK 바이트를 UTF-8로 디코딩

    오래된 Windows 소프트웨어, 많은 시리얼 장치, 레거시 데이터베이스의 중국어 텍스트는 GBK입니다. 이를 UTF-8로 디코딩하면 실패하거나 출력이 대체 문자로 가득 찹니다. 인코딩 표를 보고 뜻이 통하는 해석을 사용하세요.

    ✗ 오류
    >>> bytes.fromhex('c4e3bac3').decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
    ✓ 정상
    >>> bytes.fromhex('c4e3bac3').decode('gbk')
    '你好'

    JavaScript에서 charCodeAt()로 바이트 얻기

    charCodeAt()는 UTF-16 코드 단위를 반환합니다. ASCII에서는 우연히 바이트와 같기 때문에 버그는 다른 문자에서만 드러나며, 그때의 값은 어떤 UTF-8 시스템이 보내는 값과도 다릅니다.

    ✗ 오류
    '你'.charCodeAt(0).toString(16)   // '4f60' — a UTF-16 code unit
    ✓ 정상
    Buffer.from('你', 'utf8').toString('hex')   // 'e4bda0' — the UTF-8 bytes

    Java에서 부호 있는 바이트를 Integer.toHexString으로 포매팅

    Java의 byte는 부호가 있으므로 0x80 이상인 바이트는 음수입니다. Integer.toHexString()은 int를 대상으로 동작해 음수를 32비트 부호 없는 16진수로 출력하고, 앞자리 0도 생략합니다.

    ✗ 오류
    Integer.toHexString(b)        // "ffffffe4" for 0xE4, "a" for 0x0A
    ✓ 정상
    String.format("%02x", b)      // "e4", "0a"

    검증하지 않은 16진수로 Node.js Buffer.from() 결과를 믿기

    Buffer.from(hex, 'hex')는 절대 예외를 던지지 않습니다. 올바른 16진수가 아닌 첫 쌍에서 멈추고 끝에 남은 홀수 자리는 무시하므로, 오타가 있어도 오류 대신 더 짧은 버퍼를 돌려줍니다.

    ✗ 오류
    Buffer.from('486', 'hex')      // <Buffer 48> — the 6 is silently dropped
    Buffer.from('48zz65', 'hex')   // <Buffer 48> — stops at zz
    ✓ 정상
    if (!/^([0-9a-f]{2})*$/i.test(hex)) throw new Error('invalid hex');
    Buffer.from(hex, 'hex');

    오프셋 열까지 16진수 덤프를 붙여넣기

    공백만 제거하는 변환기는 오프셋 00000000:을 데이터로 읽고, 문자 표시 열도 가능한 부분은 16진수로 읽어 버립니다. 결과는 NUL 바이트로 시작해 거기서부터 점점 어긋납니다. 순수 16진수가 필요하면 xxd -p를 쓰거나, 열을 인식하는 이 페이지에 덤프를 붙여넣으세요.

    ✗ 오류
    00000000: 4869 20e4 bda0 e5a5 bd0d 0a              Hi ........
    → read naively: 00 00 00 00 48 69 20 e4 …
    ✓ 정상
    $ printf 'Hi 你好\r\n' | xxd -p
    486920e4bda0e5a5bd0d0a

    CR LF를 기대하는 장치에 LF만 보내기

    AT 모뎀과 많은 줄 단위 프로토콜은 각 명령이 캐리지 리턴과 라인 피드로 끝나야 합니다. 0A 하나로만 끝나는 명령은 아무 오류 없이 무시되는 경우가 많습니다.

    ✗ 오류
    41 54 2B 43 53 51 0A      AT+CSQ followed by LF only
    ✓ 정상
    41 54 2B 43 53 51 0D 0A   AT+CSQ followed by CR LF

    16진수 문자열 변환이 필요한 경우

    시리얼·UART 디버깅
    시리얼 터미널은 수신한 데이터를 16진수로 보여 줍니다. 프레임을 붙여넣으면 그 안의 텍스트를 읽고 끝에 붙은 0D 0A00을 찾을 수 있으며, 반대 방향으로는 장치가 받아들이는 CR LF 줄 끝의 명령을 구성할 수 있습니다.
    패킷 캡처 읽기
    Wireshark나 tcpdump에서 복사한 프로토콜 페이로드는 16진수입니다. 프레임 안의 요청 줄, JSON 본문, 장치 이름을 디코딩할 때는 스크립트를 작성하는 것보다 여기서 하는 편이 빠르고, 데이터가 내 컴퓨터를 벗어나지도 않습니다.
    애플리케이션 로그 속 바이트 배열
    Java는 바이트 배열을 부호 있는 10진수로, Python은 b'...' 리터럴로, Node.js는 <Buffer ...>로 로그에 남깁니다. 로그 조각을 그대로 붙여넣으면 UTF-8인지 GBK인지까지 포함해 텍스트를 확인할 수 있습니다.
    데이터베이스의 16진수 칼럼과 BLOB
    데이터베이스 도구는 바이너리 칼럼을 16진수로 표시합니다. 값을 디코딩해 실제로 무엇이 저장되었는지 확인하거나, 텍스트를 16진수로 변환해 데이터베이스에 있는 값과 바이트 단위로 비교하세요.
    펌웨어와 C 소스의 문자열
    임베디드 코드는 텍스트를 바이트 배열에 담습니다. 문자열을 바로 붙여넣을 수 있는 C 배열로 변환하거나, 헤더 파일의 배열을 다시 텍스트로 읽어 장치가 무엇을 출력할지 확인하세요.

    16진수와 텍스트의 대응: ASCII, UTF-8, GBK, UTF-16

    1바이트는 16진수 두 자리
    1바이트는 8비트, 16진수 한 자리는 4비트이므로 모든 바이트는 정확히 16진수 두 자리(00~FF)이며, 바이트 수는 항상 자릿수의 절반입니다. 대문자와 소문자는 같은 뜻입니다. 구분자, 접두사, 배열 문법은 표기일 뿐입니다. 4865, 48 65, 0x48, 0x65, \x48\x65는 모두 같은 2바이트입니다.
    ASCII: 모든 인코딩이 공통으로 쓰는 바이트
    ASCII는 00부터 7F까지를 할당합니다. 출력 가능한 문자는 20(공백)부터 7E(~)까지이고 나머지는 제어 문자이며, 실제 데이터에서 가장 자주 보이는 것은 00(NUL), 09(탭), 0A(라인 피드), 0D(캐리지 리턴), 1B(이스케이프)입니다. UTF-8, GBK, ISO-8859-1 모두 이 값을 그대로 유지하므로, 영어로만 된 텍스트는 인코딩을 잘못 골라도 거의 깨지지 않습니다.
    UTF-8: 문자당 1~4바이트
    UTF-8은 ASCII를 1바이트로, 나머지 문자는 바이트 시퀀스로 씁니다. 첫 바이트가 길이를 알려 줍니다. C2DF는 2바이트, E0EF는 3바이트, F0F4는 4바이트이며, 뒤따르는 바이트는 모두 80BF 범위여야 합니다. 구조가 이렇게 엄격하기 때문에 GBK로 된 중국어 문장이 올바른 UTF-8이 되는 일은 거의 없고(중국어 문장 33,910개로 시험했을 때 55개였습니다), 자동 판별은 UTF-8 디코딩이 깔끔하게 성공하면 그 결과를 신뢰합니다. 한 글자만 있을 때는 다릅니다. GBK 문자의 약 18%는 우연히 올바른 2바이트 UTF-8 시퀀스를 이룹니다.
    GBK: 중국어 문자당 2바이트
    GBK는 ASCII를 1바이트로 두고, 중국어 문자와 전각 문장 부호를 2바이트로 인코딩합니다. 선행 바이트는 81부터 FE까지, 후행 바이트는 7F를 제외한 40부터 FE까지입니다. 후행 바이트 범위가 매우 넓어서, 짧은 UTF-8 텍스트를 GBK로 읽으면 오류 없이 관계없는 문자로 디코딩되는 경우가 많습니다. E4 BD A0 E5 A5 BD(你好)는 浣犲ソ가 됩니다. 이 페이지가 UTF-8을 먼저 시도하는 이유입니다. GB18030은 드문 문자를 위한 4바이트 시퀀스를 더해 GBK를 확장한 것이며, 이 페이지의 디코딩은 이것도 받아들입니다.
    UTF-16과 바이트 순서
    UTF-16은 문자당 2바이트(기본 다국어 평면 밖의 문자는 4바이트)를 쓰며, 두 바이트의 순서는 어느 쪽이든 될 수 있습니다. UTF-16LE는 하위 바이트가 먼저 와서 A가 41 00이고, UTF-16BE는 상위 바이트가 먼저 와서 00 41입니다. Windows API와 많은 파일은 리틀 엔디언을 쓰며 BOM FF FE로 시작할 수 있고, UTF-8 파일도 가끔 EF BB BF로 시작합니다. 자동 판별은 BOM을 제거하고 그 사실을 알려 줍니다.

    16진수와 문자열을 안정적으로 변환하는 방법

    보내는 쪽과 받는 쪽 모두 인코딩을 명시
    16진수만으로는 어떤 인코딩에서 나왔는지 알 수 없습니다. 텍스트를 바이트로 변환하는 모든 곳(getBytes(), encode(), 시리얼 터미널 설정, 데이터베이스 연결 문자 집합)에서 인코딩을 명시적으로 지정하고 16진수 옆에 적어 두어, 받는 쪽이 추측하지 않아도 되게 하세요.
    문자 코드가 아니라 바이트를 다루기
    JavaScript의 charCodeAt()나 Java의 char 값처럼 문자 코드를 반환하는 함수는 인코딩된 바이트가 아니라 UTF-16 코드 단위를 돌려줍니다. 먼저 TextEncoder, Buffer.from(), getBytes(StandardCharsets.UTF_8)로 문자열을 인코딩한 다음 바이트를 포매팅하세요.
    모든 바이트를 항상 두 자리로 채우기
    %02x 또는 같은 역할의 방법을 쓰고, 숫자를 16진수로 바로 변환하는 호출은 피하세요. 로그에서 a0a는 비슷해 보이지만, 0을 채우지 않은 값을 이어 붙이면 길이가 홀수인 문자열이 되거나, 더 나쁘게는 전혀 다른 바이트로 디코딩되는 문자열이 됩니다.
    한 로그 안에서는 구분 형식을 통일
    로그와 트레이스에는 공백으로 구분한 두 자리씩처럼 형식 하나를 정해 꾸준히 쓰세요. 형식이 섞이면 사람은 쉽게 읽어도 스크립트는 잘못 읽기 쉽고, 일부 값만 0을 채운 경우에는 특히 그렇습니다.
    바이트 수 확인
    변환 결과를 믿기 전에 바이트 수를 예상 값과 비교하세요. 프로토콜 헤더의 길이 필드, 칼럼 크기, 파일 크기 같은 값입니다. 이 페이지는 양방향 모두 바이트 수를 보여 줍니다.

    16진수 문자열 변환 자주 묻는 질문

    16진수를 문자열로 변환하려면 어떻게 하나요?
    「16진수 → 텍스트」 탭 입력란에 16진수를 붙여넣으면 바로 텍스트가 나타납니다. 손으로 하려면 두 단계를 거칩니다. 첫째, 16진수를 두 자리씩 나눕니다. 16진수 두 자리가 1바이트이고 범위는 00부터 FF까지이므로, 48656c6c6f는 48, 65, 6C, 6C, 6F의 5바이트입니다. 둘째, 그 바이트를 문자 인코딩에 따라 디코딩합니다. ASCII와 UTF-8에서 48은 H, 65는 e, 6C는 l, 6F는 o이므로 Hello가 됩니다. 결과가 달라지는 곳은 두 번째 단계입니다. 7F보다 큰 바이트는 UTF-8, GBK 등 인코딩마다 다른 문자를 뜻하므로, 이 페이지는 인코딩을 판별하고 모든 해석을 나란히 보여 줍니다.
    16진수를 변환하면 글자가 깨지는 이유는 무엇인가요?
    거의 언제나 바이트를 잘못된 인코딩으로 디코딩했기 때문입니다. 중국어 텍스트가 대표적입니다. C4 E3 BA C3은 GBK에서는 你好이지만 UTF-8로는 올바르지 않고, E4 BD A0 E5 A5 BD는 UTF-8에서는 你好인데 GBK로 읽으면 浣犲ソ가 됩니다. 결과 아래 인코딩 표에서 뜻이 통하는 텍스트로 읽히는 행이 데이터가 원래 쓰인 인코딩입니다. 한두 글자뿐이라면 자동 판별로도 항상 구분할 수는 없습니다. D2 BB는 올바른 UTF-8(һ)이면서 GBK(一)이기도 하므로, 결과 아래에 표시되는 GBK 해석을 확인하세요. 그 밖에 따져 볼 만한 원인이 두 가지 있습니다. 16진수 자리가 하나 많거나 적어서 뒤따르는 모든 바이트가 반 바이트씩 밀린 경우, 그리고 16진수 덤프를 오프셋 열까지 함께 붙여넣은 경우입니다. 16진수가 아니라 이미 깨진 텍스트(예: 浣犲ソ)를 가지고 있다면 그 텍스트를 인코딩 변환기에 붙여넣으세요.
    시리얼 데이터가 텍스트로는 깨져 보이는데 16진수로는 정상인 이유는 무엇인가요?
    16진수가 맞다면 보드레이트, 데이터 비트, 패리티 설정에는 문제가 없습니다. 이 설정이 틀리면 바이트 자체가 달라지기 때문입니다. 문제는 바이트를 문자로 변환하는 단계에 있고, 원인은 대개 다음 세 가지 중 하나입니다. 첫째, 데이터가 애초에 텍스트가 아닐 수 있습니다. Modbus RTU 같은 바이너리 프로토콜은 16진수로 봐야만 의미가 있습니다. 둘째, 인코딩이 맞지 않을 수 있습니다. 장치는 중국어를 UTF-8로 보내는데 시리얼 터미널은 GBK로 표시하거나 그 반대라면, 你好의 UTF-8 바이트 E4 BD A0 E5 A5 BD가 浣犲ソ로 표시됩니다. 셋째, 텍스트에 00이나 0D 0A 같은 제어 바이트가 섞여 있어 네모 기호나 줄바꿈으로 표시될 수 있습니다. 16진수를 여기에 붙여넣으면 인코딩 표에 UTF-8과 GBK 해석이 나란히 표시되고, 제어 바이트는 ␀ ␍ ␊로 나타납니다.
    Hex를 ASCII로 변환하는 것과 UTF-8로 변환하는 것의 차이는 무엇인가요?
    ASCII는 00부터 7F까지의 바이트만 정의합니다. 영문자, 숫자, 문장 부호, 제어 문자입니다. UTF-8은 이 바이트들이 정확히 같은 문자를 뜻하도록 설계되었고, 그 밖의 모든 문자는 80 이상의 바이트로 이루어진 시퀀스로 표현합니다. 악센트가 붙은 라틴 문자는 2바이트, 한중일 문자 대부분은 3바이트, 이모지는 4바이트입니다. 그래서 영어로만 된 텍스트라면 Hex를 ASCII로 변환하든 UTF-8로 변환하든 결과가 똑같습니다. 차이는 80 이상의 바이트가 나타나는 순간 생깁니다. ASCII만 아는 변환기는 그런 바이트를 문자로 표시하지 못하지만, UTF-8은 이를 Unicode 전체 범위의 문자로 디코딩합니다. 00부터 7F까지 각 바이트가 무엇을 나타내는지는 ASCII 코드표에서 확인하세요.
    중국어 한자 한 글자는 16진수로 몇 바이트인가요?
    인코딩에 따라 다릅니다. UTF-8에서 중국어 한자는 대부분 3바이트로, 你는 E4 BD A0입니다. GBK와 GB2312에서는 2바이트로, 你는 C4 E3입니다. UTF-16에서는 기본 다국어 평면(BMP)에 있는 문자가 2바이트이며 바이트 순서가 중요합니다. 你는 UTF-16LE에서 60 4F, UTF-16BE에서 4F 60입니다. 이 평면 밖의 드문 문자는 UTF-8에서 4바이트, UTF-16에서 4바이트(서로게이트 쌍), GB18030에서 4바이트입니다. 「텍스트 → 16진수」 탭에서 인코딩을 전환하면 내 텍스트의 바이트 수를 확인할 수 있습니다.
    Python에서 16진수를 문자열로 변환하려면 어떻게 하나요?
    bytes.fromhex()로 바이트열을 얻은 다음 디코딩합니다. bytes.fromhex('48656c6c6f').decode('utf-8')'Hello'를 반환합니다. fromhex는 바이트 사이의 공백을 허용하므로 bytes.fromhex('48 65 6c 6c 6f')도 동작하지만, 0x 접두사가 있으면 ValueError가 발생합니다. GBK 데이터는 'gbk'로 디코딩하세요. bytes.fromhex('c4e3bac3').decode('gbk')'你好'를 반환하고, 같은 바이트를 UTF-8로 디코딩하면 UnicodeDecodeError가 발생합니다. 반대 방향은 '你好'.encode('utf-8').hex()이며 'e4bda0e5a5bd'를 반환합니다. .hex(' ')처럼 구분자를 넘기면 공백으로 구분된 결과를 얻습니다.
    JavaScript에서 16진수를 문자열로 변환하려면 어떻게 하나요?
    Node.js에서는 Buffer.from('48656c6c6f', 'hex').toString('utf8')'Hello'를 반환합니다. 잘못된 입력에 주의하세요. Node는 예외를 던지지 않고 첫 번째 잘못된 쌍에서 멈추며, 끝에 남은 홀수 자리 하나는 조용히 버립니다. 그래서 Buffer.from('486', 'hex')는 1바이트 버퍼가 됩니다. 브라우저에서는 바이트를 직접 조립한 뒤 TextDecoder를 사용하며, 이것으로 GBK도 읽을 수 있습니다. new TextDecoder('gbk').decode(Uint8Array.from('c4e3bac3'.match(/../g), h => parseInt(h, 16)))'你好'를 반환합니다. 바이트를 얻으려고 charCodeAt()를 쓰지 마십시오. '你'.charCodeAt(0).toString(16)'4f60'으로, UTF-8 바이트 e4bda0이 아니라 UTF-16 코드 단위입니다.
    C 언어나 C++에서 16진수 문자열을 문자열로 변환하려면 어떻게 하나요?
    16진수를 두 자리씩 unsigned char 버퍼로 읽어 들인 뒤 종료 문자를 붙입니다. for (size_t i = 0; i < n; i++) sscanf(hex + 2 * i, "%2hhx", &buf[i]); buf[n] = '\0';에서 nstrlen(hex) / 2입니다. hex48656c6c6f2c20e4b896e7958c로 두고 UTF-8 터미널에서 buf를 출력하면 Hello, 世界가 나옵니다. 반대 방향은 각 바이트를 printf("%02X ", (unsigned char)s[i])로 출력합니다. 이 캐스트가 중요합니다. char가 부호 있는 타입인 플랫폼에서는 0xE4 같은 바이트가 부호 확장되어 FFFFFFE4로 출력되기 때문입니다. C++에서는 s.push_back(static_cast<char>(std::stoi(hex.substr(i, 2), nullptr, 16)))로 두 자리씩 추가하면 되고, 같은 hex에서 Hello, 世界가 나옵니다.
    Java에서 16진수를 문자열로 변환하는 방법과 ffffffe4가 출력되는 이유는 무엇인가요?
    Java 17 이상에서는 new String(HexFormat.of().parseHex(hex), StandardCharsets.UTF_8) 한 줄이면 됩니다. GBK 데이터라면 대신 Charset.forName("GBK")를 쓰세요. 반대 방향으로 변환할 때 흔히 당황하게 되는 결과가 ffffffe4입니다. 이는 Java의 byte는 부호가 있고 Integer.toHexString()int를 받기 때문입니다. 바이트 0xE4는 -28로 저장되며, int로 확장해도 값은 -28 그대로입니다. toHexString은 음수를 부호 없는 32비트 값으로 출력하므로 ffffffe4가 됩니다. 이 메서드는 앞자리 0도 생략하므로 0x0Aa로 출력됩니다. 음수 바이트를 부호 없는 8비트 값으로 포매팅하는 String.format("%02x", b)를 쓰거나, Integer.toHexString(b & 0xff)에 0 채우기를 더하세요. Java 17 이상에서는 HexFormat.of().formatHex(bytes)로 배열 전체를 변환하고 HexFormat.of().parseHex(hex)로 되돌릴 수 있습니다.
    PHP에서 16진수를 문자열로 변환하는 함수는 무엇인가요?
    hex2bin()은 16진수 문자열을 바이너리 문자열로 디코딩하고, bin2hex()는 그 반대입니다. bin2hex('Hello')48656c6c6f를 반환합니다. PHP 매뉴얼에 따르면 입력 길이가 홀수이거나 올바른 16진수가 아니면 hex2bin()false를 반환하고 E_WARNING을 발생시키므로, 호출하기 전에 공백과 0x 접두사를 제거하세요. PHP 문자열은 바이트이므로 결과는 원래 텍스트의 인코딩을 그대로 따릅니다. 페이지가 UTF-8이라면 GBK 출력은 mb_convert_encoding()으로 변환하세요.
    xxd나 hexdump 출력을 그대로 붙여넣어도 되나요?
    네. 오프셋 열과 문자 표시 열을 인식해 제거하고, 입력란 아래에 그 사실을 알려 줍니다. 공백만 제거하는 변환기는 오프셋을 데이터로 읽기 때문에 이 점이 중요합니다. 이 페이지는 xxd(-u, -c, -g 포함), hexdump -C, Go의 hex.Dump, od -A x -t x1, GNU od -t x1z를 처리하며, hexdump와 od가 반복되는 행 대신 출력하는 * 행도 펼칩니다. 바이트가 아니라 16비트 워드를 출력하는 옵션 없는 hexdumpod -x도 처리합니다. 리틀 엔디언 기기에서는 바이트 48 696948로 출력되므로, 각 쌍의 순서를 되돌리고 마지막 오프셋을 이용해 홀수 길이 데이터에 덧붙은 패딩 바이트를 제거합니다. xxd, hexdump, od의 각 변형은 무작위 데이터의 실제 덤프 600개로 테스트했습니다.
    16진수 자릿수가 홀수라면 무슨 뜻인가요?
    무언가가 빠졌거나 더해졌다는 뜻입니다. 1바이트는 정확히 16진수 두 자리이기 때문입니다. 흔한 원인은 숫자를 16진수로 변환하는 함수가 앞자리 0을 떨어뜨린 경우(0a 대신 a), 복사하다가 한 글자가 잘린 경우, 0 자리에 O 같은 글자가 잘못 들어간 경우입니다. Python의 hex(int.from_bytes(data, 'big'))처럼 모든 바이트를 하나의 큰 수로 변환해 얻은 16진수 문자열은 맨 앞의 0을 잃습니다. \r\n0xd0a가 됩니다. 이 페이지는 어느 자리가 빠졌는지 추측하지 않습니다. 잘못 추측하면 그 뒤의 모든 바이트가 반 바이트씩 밀려 그럴듯한 엉터리 결과가 나오기 때문입니다. 대신 「앞에 0 추가」와 「마지막 자리 삭제」라는 두 가지 원클릭 수정 버튼이 있으므로 결과를 비교해 볼 수 있습니다. 0x0 0xa처럼 값마다 접두사를 붙여 따로 쓴 경우는 문제없습니다. 각 값이 온전한 1바이트로 읽힙니다.
    붙여넣은 데이터가 어딘가에 업로드되나요?
    아닙니다. 변환은 브라우저의 JavaScript에서 실행되며, 서버로 전송되거나 저장되거나 페이지 URL에 추가되는 내용은 없습니다. 브라우저 개발자 도구의 네트워크 패널에서 직접 확인할 수 있습니다. 변환기에 붙여넣는 16진수는 패킷 캡처, 펌웨어 덤프, 운영 로그의 한 줄인 경우가 많으므로 이 점이 중요합니다.

    아스키코드표와 ASCII 변환기

    인코딩 & 포매팅

    ASCII 128자 전체 코드표. 10진수, 16진수, 8진수, 2진수 대조와 문자↔ASCII 코드 양방향 변환. 제어문자는 이스케이프와 캐럿 표기까지 정리한 온라인 도구.

    Base64 디코더 · 인코더 (Base64 Decoder & Encoder)

    인코딩 & 포매팅

    Base64를 온라인에서 무료로 인코딩하고 디코딩합니다. UTF-8과 이모지를 완벽 지원하는 실시간 변환으로, 100% 브라우저에서 처리되어 회원 가입이 필요 없습니다.

    Base64 이미지 변환기 (온라인)

    인코딩 & 포매팅

    Base64 문자열이나 데이터 URI를 온라인 브라우저에서 이미지로 디코딩합니다. 미리보고, 치수와 MIME을 읽은 뒤 PNG, JPG, GIF, SVG로 다운로드하세요. 업로드 없음.

    CSV to JSON 변환기 (CSV to JSON Converter)

    인코딩 & 포매팅

    브라우저에서 CSV를 JSON으로 변환합니다. RFC 4180, 타입 추론, 헤더 행, 큰 정수 안전 처리. 100% 비공개, 업로드 없음.

    인코딩 변환과 한글 깨짐 복구

    인코딩 & 포매팅

    깨진 문자를 붙여넣으면 원문을 되살립니다. UTF-8, EUC-KR, GBK, Big5 조합을 모두 시도하고 왕복 검증을 통과한 경로를 표시합니다. 브라우저 안에서만 처리됩니다.

    .env을 JSON으로 변환하는 도구

    인코딩 & 포매팅

    .env 파일을 붙여넣으면 즉시 JSON으로 변환됩니다. 데이터베이스 비밀번호, API 키, 토큰이 브라우저를 절대 벗어나지 않는 100% 비공개 무료 온라인 dotenv 파서입니다.