android - 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 的倍数。如果我应该提供更多信息,请告诉我?谢谢。
解决方案
编码字符串中是否有一些行终止符?
将com.google.android.gms.common.util.Base64Utils#encode
传递标志传递0
给Base64#encodeToString
. 这意味着结果将是一个多行、填充、非 url 安全的字符串。
推荐阅读
- python-3.x - 对于这个特定示例,如何在 python 中进行字符串格式化
- tensorflow - 超过 grpc 截止日期的部署 tf-serving 问题
- python - 如何编写 python 脚本以在 Window 中运行现有的任务调度程序
- javascript - Lambda@Edge 在源请求上设置 Cookie
- java - 保存 Hibernate JPA 实体后外键为空
- react-native - React Native 在两个类组件中传递和获取参数
- laravel - Laravel 8 中的后台任务
- asp.net - System.ComponentModel.Win32Exception:等待操作超时错误
- c# - .NET Core 视图在 IIS 中部署后未更新
- php - 在 HTML 表格的每个单元格中添加增加/减少按钮并更新数据库中的值