日々精進

新しく学んだことを書き留めていきます

Base64.decodeで「java.lang.IllegalArgumentException: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value. Expected the discarded bits to be zero.」エラー

原因はBase64.decodeに渡した文字列が4で割り切れない文字数になっているため。

Base64は64種類の文字でバイナリデータを表現しているため、1文字が6bitに相当する。なので4文字=24bitを1セットとしてエンコードする。

エンコードするデータが24bitで割り切れない場合は余った分=を詰める。これがpadding。何らかの原因でpaddingがされなかったものと思われるので、普通はpaddingすればエラーは消える。が、「=」をpaddingしてもエラーが消えなかったのでBase64.decodeのソースコードを読んでみると、データの末尾2bitが0であることをチェックしていた。なぜ・・・「=」の代わりに「000」「A」を詰めるとエラーが消えた。

参考:

ja.wikipedia.org

zenn.dev