KotlinでBase64のエンコード / デコード

KotlinでBase64変換を行う例

外部システムとバイナリデータを受け渡しする際など、データをBase64エンコードしたいケースがあると思います。
このような時、KotlinでBase64変換するには以下の行います。

// ※事前に「import java.util.Base64」のimport定義を行ってください。 // バイナリデータ(testData)をBase64エンコードする例 val testData = byteArrayOf(0x01, 0x02, 0x03, 0x04) val b64Encode: String = Base64.getEncoder().encodeToString(testData) // “AQIDBA==”というBase64変換後の文字列が表示される println(b64Encode)

逆にBase64エンコードされた文字列をデコードしたい場合の例は以下のようになります。

// “AQIDBA==”というBase64文字列をデコードする例 val base64Decode = Base64.getDecoder().decode(base64Encode) // “01020304”と表示される(Base64エンコードする前の形に戻っていることがわかる) println(base64Decode.toHexString())

Base64変換のメリデメ

Base64変換におけるメリット / デメリットとしては以下の内容が挙げられます。

  • メリット
    • バイナリデータのやりとりに対応していないI/Fでも、データのやり取りが可能になる。
      サーバAPI(REST API)では、パラメータをJSONやXMLでやり取りすることが多いと思いますが、このようなケースでも画像などのバイナリデータをやり取りすることが可能になります。
      ※メリットは、ほぼこの1点に限られると思います。
  • デメリット
    • データサイズが大きくなってしまう。
      Base64変換前のデータと比較し、約1.37倍大きくなります。
      これに伴い、通信量やストレージ使用量を増加させることにつながります。
    • 処理負荷の増大。
      変換するひと手間が加わる分、単純に処理量が増大してしまいます。

元のデータサイズに比例して変換後のデータサイズも大きくなるため、あまり大容量のデータでの使用は適しません。

Base64の仕組み

上記メリデメでデータサイズが大きくなってしまうと書きましたが、これはBase64変換の仕組み上の理由から発生します。
なぜ増えてしまうのかを理解するために、変換の仕組みを解説します。

Base64の変換は大雑把に説明すると以下の手順になります。

  1. 元データを6bit区切りにする(余りは’0’を付与して6bitになるようにする)
  2. 6bit区切りにしたデータを変換表を元に文字列化
  3. 変換後の文字数が4の倍数になるように’=’を付け加える

上記手順の流れを図で表すと以下のようになります。

変換の手順の中で、パディング追加や6bitを1文字(8bit)に変換することから、データ長が増えてしまいます。

Base64変換表

ビット列Base64文字ビット列Base64文字ビット列Base64文字ビット列Base64文字
000000A010000Q100000g110000w
000001B010001R100001h110001x
000010C010010S100010i110010y
000011D010011T100011j110011z
000100E010100U100100k1101000
000101F010101V100101l1101011
000110G010110W100110m1101102
000111H010111X100111n1101113
001000I011000Y101000o1110004
001001J011001Z101001p1110015
001010K011010a101010q1110106
001011L011011b101011r1110117
001100M011100c101100s1111008
001101N011101d101101t1111019
001110O011110e101110u111110+
001111P011111f101111v111111/
※IETFによる規格書:https://datatracker.ietf.org/doc/html/rfc3548#page-5
※システムによっては上記以外の変換表を用いているケースもあります

おわりに

ただ使うだけであれば簡単なBase64も、仕組みや背景を調べてみると奥が深く、また複雑であることがわかります。
こういった背景知識があると問題が起きた際の調査の手掛かりになったりすることもあるので、本記事が皆さんの知識取得の一助になればうれしいです。

コメント

タイトルとURLをコピーしました