我试图在通过网络发送字节数组之前在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的倍数。 让我知道是否应该提供更多信息?谢谢。
答案 0 :(得分:0)
编码字符串中是否有行终止符?
com.google.android.gms.common.util.Base64Utils#encode
将标志0
传递到Base64#encodeToString
。这意味着结果将是多行填充的非URL安全字符串。