반응형
Encoding & Decoding 이해하기
Encoding이란
데이터를 다른 형식으로 변환하는 과정을 의미합니다.
입력한 문자나 기호들을 컴퓨터가 읽고 처리할 수 있는 형태로 변환합니다.
인코딩의 목적은 데이터를 효율적으로 전송하거나 저장하기 위함입니다.
Decoding이란
De 단어는 “반대”라는 의미를 가지고 있다.
즉, 인코딩된 데이터를 원래의 형식으로 다시 변환하는 과정을 의미합니다.
Encoding & Decoding 예시
- 문자 인코딩
- 텍스트를 컴퓨터가 이해할 수 있는 2진 데이터로 변환
- UTF-8, ASCII …
- URL 인코딩
- URL에서 사용될 수 없는 특수 문자를 %로 시작하는 숫자 코드로 인코딩합니다.
- ex) 공백은 %20으로 인코딩함
UTF-8
- 유니코드를 위한 가변 길이 문자 인코딩 방식
- 전세계 모든 문자를 동시에 표현할 수 있음
- UTF-8을 사용하면 한글을 모르는 국가에서도 한글을 인코딩하여 표현할 수 있음
Base64 Encoding
Base64 인코딩은 바이너리 데이터를 텍스트 형식으로 변환하는 방법입니다.
바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 64개의 ASCII 영역의 문자들로 이루어진 문자열로 변경합니다.
base64를 사용하는 이유
바이너리 데이터를 안전하고 효율적으로 전송 및 저장하기 위함입니다.
컴퓨터 시스템은 대부분 바이너리 데이터를 다루지만, 많은 통신 및 저장 시스템은 바이너리 데이터를 직접 처리하지 못하는 경우가 있습니다.
- 바이너리 데이터의 텍스트 변환
- 이메일 프로토콜 (MIME), JSON 같은 형식에서는 텍스트만을 전송할 수 있어 바이너리 데이터를 텍스트로 변환하는 것이 필요합니다.
- base64는 바이너리 데이터를 ASCII 텍스트로 변환하여 전송합니다.
- 특수 문자의 처리
- 네트워크나 파일 시스템에서 다룰 수 없는 특수 문자가 바이너리 데이터에 포함될 수도 있습니다. 이를 base64 인코딩을 통해 처리합니다.
- URL에서 특수 문자를 처리해야 할 때, base64로 인코딩된 데이터를 사용하면 안전하게 URL에 포함시킬 수 있음
- 안전한 전송
- 바이너리 데이터에서 특수 문자와 제어 문자가 충돌하여 오류를 발생시킬 수 있습니다.
- null 문자(0x00), 줄바꿈 문자 (0x0D, 0x0A) 등 텍스트 기반 프로토콜에서 해당 문자들을 다른 의미로 해석할 수 있음
Java를 통한 인코딩, 디코딩 실습
Java encode & decode
@Test
public void encoe() {
String test = "hello encode";
System.out.println("test = " + test);
byte[] testBytes = test.getBytes(StandardCharsets.UTF_8);
System.out.println("testBytes = " + testBytes);
String testString = new String(testBytes, StandardCharsets.UTF_8);
System.out.println("testString = " + testString);
}
//** **//
// test = hello encode
// testBytes = [B@1be2019a
// testString = hello encode
Java Base64 encode & decode
@Test
public void encoe() {
String test = "hello encode";
System.out.println("test = " + test);
byte[] testBytes = test.getBytes(StandardCharsets.UTF_8);
System.out.println("testBytes = " + testBytes);
//** **//
String encodeToString = Base64.getEncoder().encodeToString(testBytes);
System.out.println("encodeToString = " + encodeToString);
byte[] encode = Base64.getEncoder().encode(testBytes);
System.out.println("일반 인코더 : encode = " + encode);
byte[] encodedBytes = Base64.getUrlEncoder().encode(testBytes);
System.out.println("URL 인코더 : encodedBytes = " + encodedBytes);
String decoded = new String(encode, StandardCharsets.UTF_8);
System.out.println("일반 디코더 : decoded = " + decoded);
String decodedStr = new String(encodedBytes, StandardCharsets.UTF_8);
System.out.println("URL 디코더 : decodedStr = " + decodedStr);
String base64decode = new String(Base64.getDecoder().decode(encode), StandardCharsets.UTF_8);
System.out.println("base64decode = " + base64decode);
String base64Urldecode = new String(Base64.getUrlDecoder().decode(encodedBytes), StandardCharsets.UTF_8);
System.out.println("base64Urldecode = " + base64Urldecode);
}
//*** ***//
//test = hello encode
//testBytes = [B@1be2019a
//encodeToString = aGVsbG8gZW5jb2Rl
//일반 인코더 : encode = [B@446a1e84
//URL 인코더 : encodedBytes = [B@4f0f2942
//일반 디코더 : decoded = aGVsbG8gZW5jb2Rl
//URL 디코더 : decodedStr = aGVsbG8gZW5jb2Rl
//base64decode = hello encode
//base64Urldecode = hello encode
반응형
'JAVA' 카테고리의 다른 글
[Java] Java of, from, parse 정적 팩토리 메서드 이해하기 - Method Naming Convention (0) | 2024.09.19 |
---|---|
[Java] Java Switch와 if/else 성능 비교 - jump table, lookup table (1) | 2024.09.17 |
[JAVA] static, final, staic final 개념 이해하기 - 전역 변수, 상수 (0) | 2024.09.14 |
[JAVA] Java 일급 컬렉션 사용법 및 이해하기 (1) | 2024.09.08 |
[JAVA] Java Stream groupingBy 통해 그룹핑하기 (0) | 2024.08.17 |