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 printHexBinaryparseBase64Binary .

코드 조각은 GitHub 에서 찾을 수 있습니다 .