Base64와 16진수 인코딩: 어느 것을 사용해야 합니까?
빠른 답변
크기가 중요한 경우(이메일 첨부 파일, 데이터 URLs, API 페이로드) Base64을 사용하세요. 가독성이 중요한 경우(디버깅, 해시 표시, 색상 코드, 메모리 주소) Hex를 사용하세요. Base64은 더 컴팩트합니다. Hex는 사람이 더 쉽게 검사할 수 있습니다.
소개
Base64 및 Hex(16진수)는 모두 이진-텍스트 인코딩 체계입니다. Base64은 3바이트를 4개의 ASCII 문자로 인코딩합니다(33% 오버헤드). 16진수는 1바이트를 2개의 ASCII 문자로 인코딩합니다(100% 오버헤드). 둘 다 텍스트 전용 컨텍스트에서 이진 데이터를 나타내는 데 사용되지만 효율성과 가독성이 크게 다릅니다.
단계별
-
인코딩 효율성 비교
Base64: 3바이트 → 4자 = 33% 오버헤드. 16진수: 1바이트 → 2자 = 100% 오버헤드. 1KB의 데이터에 대해 Base64은 ~1.33KB를 생성합니다. 16진수는 2KB를 생성합니다. Base64은 동일한 이진 데이터에 대해 Hex보다 50% 작습니다.
-
가독성 비교
16진수는 16개의 문자(0-9, A-F)를 사용하며 각각은 4비트를 나타냅니다. 바이트 값을 쉽게 읽을 수 있습니다. Base64은 각각 6비트를 나타내는 64자(A-Z, a-z, 0-9, +, /)를 사용합니다. Base64 출력은 바이트가 문자 경계를 넘어 분할되기 때문에 수동으로 검사하기가 더 어렵습니다.
-
사용 사례 비교
Base64: 이메일 첨부 파일(MIME), 데이터 URLs, JWT 페이로드, API 바이너리 데이터 전송. 16진수: 해시 다이제스트(MD5, SHA-256), 색상 코드(#FF5733), 메모리 주소, MAC 주소, 바이너리 디버깅.
-
문자 집합과 안전성 비교
Base64은 URL 안전하지 않은 + 및 /를 사용합니다. Hex는 0-9 및 A-F/a-f만 사용합니다. 항상 URL 안전하고 파일 이름이 안전합니다. Hex는 어떤 상황에서도 안전합니다. Base64에는 URL 안전 변형이 필요할 수 있습니다.
-
사용 사례에 따라 결정하세요.
이메일, 데이터 URLs, JWT, API 페이로드: Base64(크기 중요). 해시 표시, 디버깅, 색상 코드, 메모리 주소: 16진수(가독성 문제).
예
Base64 및 Hex의 동일한 데이터
입력: Input: 'Hello' (5 bytes)
Base64: SGVsbG8= (8 chars)
Hex: 48656c6c6f (10 chars)
산출: Base64 is 20% smaller. Hex is easier to inspect (each pair = 1 byte).
일반적인 문제
- Base64은 URL 안전하지 않습니다. 표준 Base64은 URLs 및 파일 이름을 분리하는 + 및 /를 사용합니다. 웹 컨텍스트에는 URL 안전 Base64(- 및 _)을 사용합니다.
- Hex에는 100% 크기 오버헤드가 있습니다. Hex는 데이터 크기를 두 배로 늘립니다(1바이트 → 2자). 이는 대규모 바이너리 전송에 낭비입니다. 크기가 중요한 경우 Base64을 사용하세요.
- Base64 패딩 모호성: Base64 추가 = 일부 시스템에서 제거하거나 거부하는 패딩 문자 — 인코딩 및 디코딩 측면 모두에서 일관되게 패딩을 처리합니다.
- 16진수 대소문자 불일치: 일부 시스템에서는 대문자(A-F)를 사용하고 다른 시스템에서는 소문자(a-f)를 사용합니다. 잘못된 불일치를 방지하기 위해 비교하기 전에 대소문자를 정규화합니다.
팁
- 크기가 중요한 이메일 첨부 파일, 데이터 URLs 및 API 페이로드에는 Base64을 사용하세요. Hex의 100%에 비해 오버헤드가 33%에 불과합니다.
- 해시 다이제스트, 색상 코드, MAC 주소 및 사람의 가독성이 중요한 디버깅에는 Hex를 사용합니다. 각 바이트는 표시되는 2문자 쌍입니다.
- URLs, 쿼리 매개변수 또는 파일 이름에서 바이너리 데이터를 인코딩할 때 URL 안전 Base64(+를 -로, /를 _로 교체, 스트립 =)을 사용하세요.
- Base64과 Hex 간에 변환할 때는 항상 원시 바이너리로 먼저 디코딩한 다음 다시 인코딩하세요. 절대 문자 단위로 변환하지 마세요.