将压缩函数从 Python 转换为 Kotlin

Convert compress functions from Python to Kotlin

我在 Python 中有用于压缩和解压缩字符串 (bytearray) 的函数:

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)
}

但是,它给出了完全不同的结果,例如字符串 abcdefghijklmnouprstuvwxyz:

Python: 1f8b080000000000000a4b4c4a4e494d4bcfc8cccacec9cdcb2f2d282a2e292d2bafa8ac0200c197b2d21a000000
Kotlin: 789c4b4c4a4e494d4bcfc8cccacec9cdcb2f2d282a2e292d2bafa8ac020090b30b24

有什么办法,我怎样才能修改 kotlin 代码,使其得到与 Python 相同的结果?

感谢您的回复。 <3

Python 代码中的 31 参数正在请求 gzip 流,而不是 zlib 流。在 Kotlin 中,您正在生成一个 zlib 流。 (zlib 在 RFC 1950 中描述,gzip 在 RFC 1952 中描述。)

Java 的 Deflater(拼写错误)class 似乎没有该选项。它确实有一个 nowrap 选项,可以提供原始的 deflate 压缩数据,您可以围绕它构建自己的 gzip 包装器,使用 RFC 看看如何。

顺便说一下,结果并不是“完全不同”。你有 gzip 和 zlib 包装器围绕完全相同的原始 deflate 压缩数据:4b4c...0020.