Memo/기타

Java.lang.IllegalArgumentException : Illegal base64 character a

cassan 2024. 11. 6. 17:40

줄바꿈 인코딩 에러

수정전 : byte[] dd = java.util.Base64.getDecoder().decode(encodedString);

수정후 : byte[] dd = java.util.Base64.getMimeDecoder().decode(encodedString.replaceAll("\\r\\n|\\r|\\n","");

API에 보면 Returns 값이 다름

static Base64.Decoder getDecoder()
Returns a Base64.Decoder that decodes using the Basic type base64 encoding scheme.

static Base64.Decoder getMimeDecoder()
Returns a Base64.Decoder that decodes using the MIME type base64 decoding scheme.

TYPE에 관한 스펙설명

  • BASIC : 인코딩 및 디코딩 작업을 위해 RFC 4648 및 RFC 2045의 표 1에 지정된 "Base64 알파벳"을 사용합니다. _인코더는 줄 바꿈(줄 구분 기호) 문자를 추가하지 않습니다. 디코더는 base64 알파벳 외부의 문자가 포함된 데이터를 거부_합니다.
  • MIME : 인코딩 및 디코딩 작업에 RFC 2045의 표 1에 지정된 "Base64 알파벳"을 사용합니다. 인코딩된 출력은 각각 76자를 넘지 않는 줄로 표현되어야 하며, _캐리지 리턴 '\r'과 줄 바꿈을 '\n'줄 구분 기호로 사용_합니다. 인코딩된 출력의 끝에는 줄 구분 기호가 추가되지 않습니다. 디코딩 작업에서는 base64 알파벳 표에 없는 모든 줄 구분 기호 또는 기타 문자가 무시됩니다.

(사실 이 때문에 replaceAll 구간은 무의미할 수도 있다. 그런데 파람값이 분명하게 특정되지 않아서 보험용(?)으로 처리해둠)

https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Base64.html

반응형