Base64 Encoding & Decoding in Kotlin
On JVM and Android (API 26+), Kotlin uses java.util.Base64. For Kotlin Multiplatform, use kotlinx-io or ktor-utils for cross-platform support.
JVM / Android (API 26+)
import java.util.Base64
// Encode string to Base64
val original = "Hello, world!"
val encoded = Base64.getEncoder()
.encodeToString(original.toByteArray(Charsets.UTF_8))
println(encoded) // "SGVsbG8sIHdvcmxkIQ=="
// Decode Base64 to string
val decoded = Base64.getDecoder()
.decode(encoded)
.toString(Charsets.UTF_8)
println(decoded) // "Hello, world!"
Extension Functions
Adding extension functions makes Base64 feel idiomatic in Kotlin:
import java.util.Base64
fun String.encodeToBase64(): String =
Base64.getEncoder().encodeToString(toByteArray(Charsets.UTF_8))
fun String.decodeFromBase64(): String =
Base64.getDecoder().decode(this).toString(Charsets.UTF_8)
fun ByteArray.encodeToBase64(): String =
Base64.getEncoder().encodeToString(this)
fun String.decodeFromBase64ToBytes(): ByteArray =
Base64.getDecoder().decode(this)
// Usage
val encoded = "Hello, world!".encodeToBase64() // "SGVsbG8sIHdvcmxkIQ=="
val decoded = encoded.decodeFromBase64() // "Hello, world!"
URL-Safe Base64
import java.util.Base64
fun String.encodeToBase64URL(): String =
Base64.getUrlEncoder().withoutPadding()
.encodeToString(toByteArray(Charsets.UTF_8))
fun String.decodeFromBase64URL(): String =
Base64.getUrlDecoder()
.decode(this)
.toString(Charsets.UTF_8)
// Usage (common for JWTs)
val token = "user:secret".encodeToBase64URL()
println(token) // no +, /, or = characters
Android (API < 26)
For older Android versions, use android.util.Base64:
import android.util.Base64 as AndroidBase64
// Encode
val encoded = AndroidBase64.encodeToString(
"Hello".toByteArray(Charsets.UTF_8),
AndroidBase64.NO_WRAP // no newlines
)
// Decode
val decoded = AndroidBase64.decode(encoded, AndroidBase64.DEFAULT)
.toString(Charsets.UTF_8)
// URL-safe
val urlSafe = AndroidBase64.encodeToString(
"Hello".toByteArray(),
AndroidBase64.URL_SAFE or AndroidBase64.NO_PADDING or AndroidBase64.NO_WRAP
)
Encoding Files
import java.util.Base64
import java.io.File
// Encode file to Base64 string
fun File.toBase64(): String =
Base64.getEncoder().encodeToString(readBytes())
// Decode Base64 back to file
fun String.decodeBase64ToFile(outputPath: String) {
File(outputPath).writeBytes(Base64.getDecoder().decode(this))
}
// Usage
val encoded = File("image.png").toBase64()
encoded.decodeBase64ToFile("output.png")
Kotlin Multiplatform with ktor-utils
// build.gradle.kts
dependencies {
implementation("io.ktor:ktor-utils:2.3.x")
}
// Common code (all platforms)
import io.ktor.util.*
val encoded = "Hello".encodeBase64()
val decoded = encoded.decodeBase64String()
// URL-safe
val urlEncoded = "Hello".encodeBase64Url() // Not in ktor, manual:
fun String.encodeBase64Url(): String =
encodeBase64()
.replace('+', '-').replace('/', '_').trimEnd('=')
Verify your Kotlin Base64 output
Paste the Base64 string from your Kotlin or Android app into base64.dev to decode it instantly.
Open base64.dev →