【问题标题】:Convert compress functions from Python to Kotlin将压缩函数从 Python 转换为 Kotlin
【发布时间】:2022-01-21 21:19:06
【问题描述】:

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

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

Python: 1f8b080000000000000a4b4c4a4e494d4bcfc8cccacec9cdcb2f2d282a2e292d2bafa8ac0200c197b2d21a000000
Kotlin: 789c4b4c4a4e494d4bcfc8cccacec9cdcb2f2d282a2e292d2bafa8ac020090b30b24

有什么办法,如何修改 kotlin 代码,使其得到与 Python 相同的结果?

感谢您的回复。

【问题讨论】:

  • 请注意这不是代码编写或辅导服务。我们可以帮助解决具体的技术问题,而不是对代码或建议的开放式请求。请编辑您的问题以显示您迄今为止尝试过的内容,以及您需要帮助的具体问题。有关如何最好地帮助我们帮助您的详细信息,请参阅How To Ask a Good Question 页面。另外,由于这不是python问题,所以python标签不正确,请编辑。

标签: kotlin gzip zlib


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您提供它是 gzip 的信息。我在 Internet 上找到了一些示例,适用于我的代码是 fun String.gzipCompress(): ByteArray { val bos = ByteArrayOutputStream() GZIPOutputStream(bos).bufferedWriter(Charsets.UTF_8).use { it.write(this) } var ba = bos.toByteArray() ba[9] = 10 return ba 我不知道为什么它在字节 9 上有 0 而不是 10,但是其余部分是相同的,所以它工作正常。
  • ba[9],标头中的第十个字节,标识操作系统。据我所知,没有任何信息会使用该信息,因此更改它是无关紧要的。
猜你喜欢
  • 2013-08-28
  • 2021-07-24
  • 2013-12-10
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多