我需要将类型为Long的值转换为Base64编码。
我尝试将其转换为byte[],然后将其传递给Base64.encodeToString,但得到了错误的答案。
我查看了这里的许多示例,但都没有帮助。也许我误解了encodeToString的工作原理?
发布于 2020-10-18 05:55:34
使用this answer来回答“如何将Long转换为byte[]并在Java语言中返回”的问题:
import java.nio.ByteBuffer
import java.util.Base64
fun main() {
val number: Long = 12345678
val encodedNumberString = Base64.getEncoder().encodeToString(longToBytes(number))
println("Number: $number.")
println("Encoded number: \"$encodedNumberString\".")
val decodedNumberBytes = Base64.getDecoder().decode(encodedNumberString)
val decodedNumber = bytesToLong(decodedNumberBytes)
println("Decoded number: $decodedNumber.")
}
private fun longToBytes(number: Long): ByteArray {
val buffer = ByteBuffer.allocate(java.lang.Long.BYTES)
buffer.putLong(number)
return buffer.array()
}
private fun bytesToLong(bytes: ByteArray): Long {
val buffer = ByteBuffer.allocate(java.lang.Long.BYTES)
buffer.put(bytes)
// Prepare the byte buffer to enable reading from it.
buffer.flip()
return buffer.long
}这是我系统上的输出:
Number: 12345678.
Encoded number: "AAAAAAC8YU4=".
Decoded number: 12345678.更新: Base64
Base64是一种将二进制数据转换为文本的方法,它使用64个字符的安全子集,可以在例如电子邮件附件中传输。并非一个字节中的所有256个值都可以顺利发送,因此每个字符中只编码6位(2^6 = 64)。这意味着可以用4个字符传输3个字节(开销为33%)。
更新:扩展函数
正如Alex.T已经在评论中提到的,Kotlin使您能够使用扩展函数使长的<-> ByteArray转换更短(假设ByteArray实现有一个可访问的后备数组):
fun Long.toByteArray(): ByteArray = ByteBuffer.allocate(java.lang.Long.BYTES).apply { putLong(this@toByteArray) }.array()
fun ByteArray.toLong(): Long = ByteBuffer.allocate(java.lang.Long.BYTES).apply { put(this@toLong); flip() }.long
fun main() {
val number = 12345678L
val encodedNumberString = Base64.getEncoder().encodeToString(number.toByteArray())
println("Encoded number: \"$encodedNumberString\".")
val decodedNumber = Base64.getDecoder().decode(encodedNumberString).toLong()
println("Decoded number: $decodedNumber.")
}https://stackoverflow.com/questions/64407458
复制相似问题