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 →