【问题标题】:Kotlin compress/deflate string to server not workingKotlin 将字符串压缩/放气到服务器不工作
【发布时间】:2020-02-22 19:59:02
【问题描述】:

很多问题/答案,我尝试过很多都没有成功。我收到一个使用 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】:

    以防其他人遇到此问题。我可以通过将 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 个字节。我不太明白如何或为什么如果有人知道并希望分享,请这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2012-12-09
      • 2012-08-21
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多