Kotlin сжать / выкачать строку, чтобы сервер не работал - PullRequest
0 голосов
/ 22 февраля 2020

Довольно много вопросов / ответов, и многие я пытался безуспешно. Я получаю сжатую строку, которая использует 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. Я попробовал много вариантов всего этого без успеха.

У кого-нибудь есть предложения о том, что я делаю неправильно и что мне нужно сделать, чтобы заставить его работать?

Спасибо ^. ^

1 Ответ

0 голосов
/ 23 февраля 2020

На случай, если кто-то еще столкнется с этой проблемой. Я смог решить эту проблему, изменив функцию 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 .

Видимо, использование предыдущей функции добавляет 2 дополнительных байта и это то, что вызывало проблему. После изменения 2 байта не добавляются. Я не совсем понимаю, как и почему, если кто-то знает и хочет поделиться, пожалуйста, сделайте это.

...