Base64Utils.encode не создает правильную кодировку base64 - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь закодировать байтовый массив в base64 перед отправкой по сети. Вывод функции encode(), приведенной ниже, не является допустимым base64, потому что из моего исследования я прочитал, что длина строки должна быть кратна 4. Кроме того, строка не дополняется знаком "=", если длина не умножается на 4. Я предполагаю, что, поскольку никто не сталкивался с этой проблемой раньше, есть ли что-то не так в приведенном ниже коде, который делает base64 не кратным 4?


    private val messageAdapter = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()
        .adapter(RealTimePayload::class.java)

    fun encode(realTimePayload: RealTimePayload): String? {
        val jsonPayload = messageAdapter.toJson(realTimePayload)
        val compressedData = zip(jsonPayload)
        return Base64Utils.encode(compressedData)
    }

    fun decode(encodedString: String): RealTimePayload? {
        val gzippedData = Base64Utils.decode(encodedString)
        val jsonData = unzip(gzippedData)
        return messageAdapter.fromJson(jsonData)
    }

    private fun unzip(content: ByteArray): String =
        GZIPInputStream(content.inputStream()).bufferedReader().use { it.readText() }

    private fun zip(content: String): ByteArray {
        val bos = ByteArrayOutputStream()
        GZIPOutputStream(bos).bufferedWriter().use { it.write(content) }
        return bos.toByteArray()
    }
}

Редактировать : Я должен упомянуть, что конечная закодированная строка имеет некоторые конечные '=', но длина по-прежнему не кратна 4. Дайте мне знать, если я должен предоставить больше информации? Спасибо.

1 Ответ

0 голосов
/ 11 июня 2019

Есть ли в закодированной строке некоторые разделители строк?

com.google.android.gms.common.util.Base64Utils#encode передает флаг 0 в Base64#encodeToString.Это означает, что результатом будет многострочная, дополненная, не сохраненная в URL строка.

...