技術系TIPS
PR

【Kotlin入門】Base64エンコードとデコード(getEncoder, getDecoder)

saratogax
記事内に商品プロモーションを含む場合があります

暗号化するほどのデータでもないけど、なんとなく生で流すのが嫌なデータってありますよね。
(通信経路の暗号化とは別の話です)

そんな時は簡易的に情報を Bse64 でエンコードして、送信先でデコードしてもらう手段も検討されます。

逆に相手からエンコードされた情報をもらい、こちら側でデコードする場面も想定しておくといいかもしれません。

無駄に鍵を共有して AES で暗号化するとか、そこまでする必要のないデータもありますからね。

今回は、Kotlin で Base64 のエンコードとデコードを試してみたいと思います。

Base64エンコード

Kotlin で Base64 を使用する場合は、以下の Java のパッケージを利用します。

エンコードする場合は、バイト文字列を Base64 文字列に変換してあげます。

val s: String = "abcdefg"
val b64Encode: String = Base64.getEncoder().encodeToString(s.toByteArray())
println(b64Encode)

結果は以下の通りです。

YWJjZGVmZw==

試しに Linux の base64 コマンドでデコードして確認してみます。

$ echo "YWJjZGVmZw==" | base64 -d

abcdefg

元の文字列に戻りましたね。ちなみに、Mac のターミナルだと base64 のデコードは -D オプションになります。

Base64デコード

次に、Kotlin で Base64 デコードを試してみます。

こちらも、Base64 のパッケージを利用するだけなので簡単です。

val s: String = "abcdefg"
val b64Encode: String = Base64.getEncoder().encodeToString(s.toByteArray())
val b64Decode = Base64.getDecoder().decode(b64Encode.toByteArray()).toString(Charsets.UTF_8)
println(b64Decode)

結果は以下の通りです。

abcdefg

エンコードやデコードの失敗

エンコードはともかく、第三者から送られてくるデータをデコードする場合は要注意です。

Base64 でエンコードした文字列から複合化できない場合に例外が発生するからです。

上記でエンコードした「YWJjZGVmZw==」は、最後の Zw が 4 文字に満たないため == で 2 文字分吸収しているところがあります。ここをなぜか === の 3 文字にされて送信されてきたと仮定します。

YWJjZGVmZw===

この文字列を Base64 でデコードしてみます。

val b64Encode: String = "YWJjZGVmZw==="
val b64Decode = Base64.getDecoder().decode(b64Encode.toByteArray()).toString(Charsets.UTF_8)
println(b64Decode)

想定通り例外が発生しました。

Exception in thread “main” java.lang.IllegalArgumentException: Input byte array has incorrect ending byte at 12
at java.util.Base64$Decoder.decode0(Base64.java:742)
at java.util.Base64$Decoder.decode(Base64.java:526)

よって、事前に IllegalArgumentException をハンドリングできるようにしておきましょう。
(現在は runCatching が主流ですが、ここでは try, catch で)

try {
    val b64Encode: String = "YWJjZGVmZw==="
    val b64Decode = Base64.getDecoder().decode(b64Encode.toByteArray()).toString(Charsets.UTF_8)
    println(b64Decode)
} catch(e: IllegalArgumentException) {
    println("デコードできない文字列が送られてきました")
}

結果はもちろん以下になります。

デコードできない文字列が送られてきました
ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました