LoginSignup
6
4

More than 5 years have passed since last update.

Kotlinでバイト配列を圧縮・展開する

Posted at

Javaには圧縮・展開を行うためのDeflater,Inflaterというクラスがあります。これを使うと簡単なAPI呼び出しでバイト配列の圧縮と展開が行えます。

今更Javaの記事書いてもおもしろくないのでKotlinでやってみました。

圧縮する

// 圧縮元データ
val rawData: ByteArray = getData()

// 圧縮データを格納する配列。余裕を持った大きさで宣言する。元データより大きくはならないはずなので、元データと同じ大きさで宣言している。
val compressedData = ByteArray(rawData.size)

val compressor = Deflater()

// 入力データを設定
// compressor.reset() // 圧縮処理後にインスタンスを再利用する場合はこれを呼ぶ
compressor.setInput(rawData)
compressor.finish() // 入力データがこれ以上ないことを宣言する

// 圧縮を行う。結果はcompressedData[0]~compressedData[compressedDataLength-1]までの範囲に格納される。
val compressedDataLength = compressor.deflate(compressedData)

val result = compressedData.copyOfRange(0, compressedDataLength) // 圧縮結果の部分だけを取り出す

展開する

// 圧縮データ
val compressedData: ByteArray = getData()

// 展開データを格納する配列。圧縮データの長さからだけでは元のデータの長さを判断できないので、余裕を持った大きさで宣言している。
val originalData = ByteArray(10000)

val inflater = Inflater()

// 入力データを設定
// inflater.reset() // 展開処理後にインスタンスを再利用する場合はこれを呼ぶ
inflater.setInput(compressedData)
inflater.finish() // 入力データがこれ以上ないことを宣言する

// 展開を行う。結果はoriginalData[0]~originalData[originalDataLength-1]までの範囲に格納される。
val originalDataLength = inflater.inflate(originalData)

val result = originalData.copyOfRange(0, originalDataLength) // 展開結果の部分だけを取り出す

たとえばSocketやDatagramSocketなどでデータを送る時にこれを利用することで送信前にデータを圧縮して受信後に展開することで、通信帯域を節約することができます。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4