我在 Python 中有用于壓縮和解壓縮字串(位元組陣列)的函式:
def compress_message(data):
compressor = zlib.compressobj(-1, zlib.DEFLATED, 31, 8, zlib.Z_DEFAULT_STRATEGY)
compressed_data = compressor.compress(data)
compressed_data = compressor.flush()
return compressed_data
def decompress_message(compressed_data):
return zlib.decompress(compressed_data, wbits=31)
我需要將這些函式轉換為 kotlin,以便我可以在我的移動應用程式中使用它們。到目前為止,我試過這個:
fun String.zlibCompress(): ByteArray {
val input = this.toByteArray(charset("UTF-8"))
val output = ByteArray(input.size * 4)
val compressor = Deflater().apply {
setLevel(-1)
setInput(input)
finish()
}
val compressedDataLength: Int = compressor.deflate(output)
return output.copyOfRange(0, compressedDataLength)
}
但是,它給出了完全不同的結果,例如 string abcdefghijklmnouprstuvwxyz:
Python: 1f8b080000000000000a4b4c4a4e494d4bcfc8cccacec9cdcb2f2d282a2e292d2bafa8ac0200c197b2d21a000000
Kotlin: 789c4b4c4a4e494d4bcfc8cccacec9cdcb2f2d282a2e292d2bafa8ac020090b30b24
有什么辦法,我怎樣才能修改 kotlin 代碼,所以它給出與 Python 相同的結果?
感謝您的回復。<3
uj5u.com熱心網友回復:
Python 代碼中的31引數是請求gzip流,而不是 zlib 流。在 Kotlin 中,您正在生成一個 zlib 流。(zlib 在 RFC 1950 中描述,gzip 在 RFC 1952 中描述。)
Java 的Deflater(拼寫錯誤的)類似乎沒有該選項。它確實有一個nowrap選項可以提供原始的 deflate 壓縮資料,您可以圍繞它構建自己的 gzip 包裝器,使用 RFC 來了解如何操作。
順便說一句,結果并不是“完全不同”。你有 gzip 和 zlib 包裝器圍繞完全相同的原始 deflate 壓縮資料:4b4c... 0020。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/418637.html
標籤:
上一篇:型別不匹配。必需:結果<NewsResponse>!找到:結果<Response<NewsResponse>>?
下一篇:.resumeWith(Result.failure(...))和.resumeWithException之間的區別
