我正在尝试在通过网络发送之前以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的倍数。让我知道我是否应该提供更多信息?谢谢。
编码字符串中是否有一些行终止符?
com.google.android.gms.common.util.Base64Utils#encode
将旗帜0
传递给Base64#encodeToString
。这意味着结果将是一个多行、填充、非 url 安全的字符串。