Kotlin压缩/压缩字符串到服务器不起作用

问题描述 投票:0回答:1

[相当多的问题/答案,而我尝试了许多却没有成功。我收到一个使用MemoryStream和DeflateStream进行压缩的字符串(c#)。以下解压缩功能工作正常

fun decompress(string: String): String? {
    var decompressedString: String? = ""
    try {
        val bytes: ByteArray = Base64.decode(string, Base64.DEFAULT)

        val inflater = Inflater(true)
        val outputStream = ByteArrayOutputStream()
        val buffer = ByteArray(1024)
        inflater.setInput(bytes)

        while (!inflater.finished()) {
            val count = inflater.inflate(buffer)
            outputStream.write(buffer, 0, count)
        }
        inflater.end()
        outputStream.close()
        decompressedString = outputStream.toString("UTF8")

    } catch (e: IOException) {
        e.printStackTrace()
    }
    return decompressedString
}

稍后,我需要压缩数据并将其发送回。尝试压缩数据失败。服务器不断告诉我“块长度与其补码不匹配”。我使用以下函数进行压缩

fun compress(string: String): String? {
    var compressedString: String? = null
    try {
        val bytes: ByteArray = string.toByteArray(charset("UTF-8"))

        // Compress the bytes
        val deflater = Deflater()
        //val outputStream = ByteArrayOutputStream()
        val buffer = ByteArray(1024)
        deflater.setInput(bytes)
        deflater.finish()

        deflater.deflate(buffer)
        deflater.end()
        //outputStream.close()

        compressedString = Base64.encodeToString(buffer, Base64.DEFAULT)

    } catch (e: IOException) {
        e.printStackTrace()
    }
    return compressedString
}

问题不在于服务器端,因为它可与iOS应用正常运行,但不适用于Android。我已经尝试了所有这一切的许多变体,但均未成功。

任何人对于我做错了什么以及要使其正常工作需要做些什么的建议?

谢谢^。^

android kotlin zlib
1个回答
0
投票

如果其他人遇到此问题。我可以通过将deflate函数更改为

来解决它
var compressedString: String? = ""
    val bytes: ByteArray = string.toByteArray(charset("UTF-8"))
    val deflater = Deflater(1, true)
    deflater.setInput(bytes)
    deflater.finish()

    val outputStream = ByteArrayOutputStream(bytes.size)

    try {
        val bytesCompressed = ByteArray(Short.MAX_VALUE.toInt())
        val numberOfBytesAfterCompression = deflater.deflate(bytesCompressed)
        val returnValues = ByteArray(numberOfBytesAfterCompression)
        System.arraycopy(bytesCompressed, 0, returnValues, 0, numberOfBytesAfterCompression)

        compressedString = Base64.encodeToString(returnValues, Base64.DEFAULT)
    } catch (e: IOException) {
        e.printStackTrace()
    }  finally {
        deflater.end()
        outputStream.close()
    }

从这里deflater examples site获得。

显然,使用前一个功能会增加2个字节,这就是导致此问题的原因。更改后,不添加2个字节。如果有人知道并希望分享,我不太了解如何或为什么这样做,请这样做。

© www.soinside.com 2019 - 2024. All rights reserved.