1. 개요
이 자습서에서는 Java에서 Base64 인코딩 및 디코딩 기능을 제공하는 다양한 유틸리티를 살펴 봅니다.
주로 Apache Commons에서 나오는 새로운 Java 8 API와 유틸리티 API를 설명 할 것입니다.
2. Base 64 용 Java 8
Java 8은 마침내 표준 API 에 Base64 기능 을 추가했습니다 . 이것은 java.util.Base64 유틸리티 클래스 를 통해 이루어 집니다.
기본 인코더 프로세스부터 살펴 보겠습니다.
2.1. 자바 8 기본 Base64
기본 인코더는 일을 단순하게 유지하고 라인 분리없이 입력을 그대로 인코딩합니다.
출력은 A-Za-z0-9 + / 문자 집합의 문자 집합에 매핑되고 디코더는이 집합 외부의 모든 문자를 거부합니다.
먼저 간단한 문자열을 인코딩 해 보겠습니다 .
String originalInput = "test input";
String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());
간단한 getEncoder () 유틸리티 메서드 를 통해 전체 Encoder API를 검색하는 방법에 유의하십시오 .
이제 해당 문자열을 다시 원래 형식으로 디코딩 해 보겠습니다.
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);
2.2. 패딩없는 Java 8 Base64 인코딩
Base64 인코딩에서 출력 인코딩 된 문자열의 길이는 3의 배수 여야합니다. 그렇지 않은 경우 출력은 추가 패드 문자 ( = ) 로 채워집니다 .
디코딩시 이러한 추가 패딩 문자는 삭제됩니다. Base64의 패딩에 대해 자세히 알아 보려면 Stack Overflow에서 자세한 답변을 확인하세요 .
출력의 패딩 을 건너 뛰어야하는 경우 ( 아마도 결과 문자열이 다시 디코딩되지 않기 때문에) 패딩없이 인코딩 하도록 선택할 수 있습니다 .
String encodedString =
Base64.getEncoder().withoutPadding().encodeToString(originalInput.getBytes());
2.3. 자바 8 URL 인코딩
URL 인코딩은 위에서 살펴본 기본 인코더와 매우 유사합니다. URL 및 파일 이름 Safe Base64 알파벳을 사용하며 줄 구분을 추가하지 않습니다.
String originalUrl = "https://www.google.co.nz/?gfe_rd=cr&ei=dzbFV&gws_rd=ssl#q=java";
String encodedUrl = Base64.getUrlEncoder().encodeToString(originalURL.getBytes());
디코딩은 거의 동일한 방식으로 발생합니다. getUrlDecoder () 유틸리티 메소드는 반환 java.util.Base64.Decoder 다음 URL을 디코딩하는 데 사용됩니다 :
byte[] decodedBytes = Base64.getUrlDecoder().decode(encodedUrl);
String decodedUrl = new String(decodedBytes);
2.4. 자바 8 MIME 인코딩
인코딩 할 몇 가지 기본 MIME 입력을 생성하여 시작하겠습니다.
private static StringBuilder getMimeBuffer() {
StringBuilder buffer = new StringBuilder();
for (int count = 0; count < 10; ++count) {
buffer.append(UUID.randomUUID().toString());
}
return buffer;
}
MIME 인코더는 기본 알파벳을 사용하지만 MIME 친화적 인 형식으로 Base64로 인코딩 된 출력을 생성합니다.
출력의 각 행은 76 자 이하이며 캐리지 리턴과 라인 피드 ( \ r \ n )로 끝납니다 .
StringBuilder buffer = getMimeBuffer();
byte[] encodedAsBytes = buffer.toString().getBytes();
String encodedMime = Base64.getMimeEncoder().encodeToString(encodedAsBytes);
getMimeDecoder () 유틸리티 메소드 리턴 java.util.Base64.Decoder 후, 디코딩 프로세스에서 사용된다 :
byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime);
String decodedMime = new String(decodedBytes);
3. Apache Commons 코드를 사용한 인코딩 / 디코딩
먼저 pom.xml 에서 commons-codec 의존성을 정의해야합니다 .
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
최신 버전의 라이브러리가 Maven Central 에서 릴리스되었는지 확인할 수 있습니다 .
주요 API는 org.apache.commons.codec.binary.Base64 클래스로, 다양한 생성자로 매개 변수화 할 수 있습니다.
- Base64 (boolean urlSafe) 는 URL 안전 모드 (켜짐 또는 꺼짐)를 제어하여 Base64 API를 만듭니다.
- Base64 (int lineLength) 는 URL 안전하지 않은 모드에서 Base64 API를 만들고 줄의 길이를 제어합니다 (기본값은 76).
- Base64 (int lineLength, byte [] lineSeparator) 는 기본적으로 CRLF ( "\ r \ n") 인 추가 줄 구분 기호를 허용하여 Base64 API를 만듭니다.
Base64 API가 생성되면 인코딩과 디코딩이 모두 매우 간단합니다.
String originalInput = "test input";
Base64 base64 = new Base64();
String encodedString = new String(base64.encode(originalInput.getBytes()));
Base64 클래스 의 decode () 메서드 는 디코딩 된 문자열을 반환합니다.
String decodedString = new String(base64.decode(encodedString.getBytes()));
또 다른 간단한 옵션은 인스턴스를 만드는 대신 Base64 의 정적 API를 사용하는 것입니다.
String originalInput = "test input";
String encodedString = new String(Base64.encodeBase64(originalInput.getBytes()));
String decodedString = new String(Base64.decodeBase64(encodedString.getBytes()));
4. 문자열 을 바이트 배열 로 변환
때로는 String 을 byte [] 로 변환해야합니다 . 이를 수행하는 가장 간단한 방법은 String getBytes () 메서드 를 사용 하는 것입니다.
String originalInput = "test input";
byte[] result = originalInput.getBytes();
assertEquals(originalInput.length(), result.length);
시스템에 따라 다르기 때문에 기본 인코딩에 의존하지 않고 인코딩도 제공하는 것이 좋습니다.
String originalInput = "test input";
byte[] result = originalInput.getBytes(StandardCharsets.UTF_16);
assertTrue(originalInput.length() < result.length);
문자열이 Base64로 인코딩 된 경우 Base64 디코더를 사용할 수 있습니다 .
String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = Base64.getDecoder().decode(originalInput);
assertEquals("test input", new String(result));
DatatypeConverter parseBase64Binary () 메서드를 사용할 수도 있습니다 .
String originalInput = "dGVzdCBpbnB1dA==";
byte[] result = DatatypeConverter.parseBase64Binary(originalInput);
assertEquals("test input", new String(result));
마지막으로 DatatypeConverter 메서드를 사용하여 16 진수 문자열 을 byte [] 로 변환 할 수 있습니다 .
String originalInput = "7465737420696E707574";
byte[] result = DatatypeConverter.parseHexBinary(originalInput);
assertEquals("test input", new String(result));
5. 결론
이 기사에서는 Java 8 및 Apache Commons에 도입 된 새로운 API를 사용하여 Java에서 Base64 인코딩 및 디코딩을 수행하는 방법에 대한 기본 사항을 설명했습니다.
마지막으로, 비슷한 기능을 제공하는 몇 가지 다른 API가 있습니다 : java.xml.bind.DataTypeConverter with printHexBinary 및 parseBase64Binary .