首页 > 解决方案 > Base64Utils.encode 不产生有效的 base64 编码

问题描述

我试图在通过网络发送它之前在 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 的倍数。如果我应该提供更多信息,请告诉我?谢谢。

标签: androidkotlinbase64moshi

解决方案


编码字符串中是否有一些行终止符?

com.google.android.gms.common.util.Base64Utils#encode传递标志传递0Base64#encodeToString. 这意味着结果将是一个多行、填充、非 url 安全的字符串。


推荐阅读