This page covers Base64 encoding/decoding in iOS (Swift) and Android (Kotlin/Java) mobile development. It includes native APIs, common patterns, and practical examples for mobile applications.
Both iOS and Android provide built-in Base64 support: iOS uses Data and String extensions,
while Android uses Base64 utility class. This guide covers encoding/decoding strings, data, and images
for mobile development scenarios.
import Foundation
// String to Base64
let text = "Hello, World!"
let data = text.data(using: .utf8)!
let base64String = data.base64EncodedString()
print(base64String) // SGVsbG8sIFdvcmxkIQ==
// Base64 to String
if let decodedData = Data(base64Encoded: base64String) {
let decodedString = String(data: decodedData, encoding: .utf8)
print(decodedString) // Hello, World!
}
import UIKit
// UIImage to Base64
func imageToBase64(_ image: UIImage) -> String? {
guard let imageData = image.jpegData(compressionQuality: 0.8) else { return nil }
return imageData.base64EncodedString()
}
// Base64 to UIImage
func base64ToImage(_ base64String: String) -> UIImage? {
guard let data = Data(base64Encoded: base64String) else { return nil }
return UIImage(data: data)
}
// Usage
let image = UIImage(named: "sample")
let base64Image = imageToBase64(image)
let restoredImage = base64ToImage(base64Image!)
import Foundation
// URL-safe Base64 encoding
func urlSafeBase64Encode(_ data: Data) -> String {
return data.base64EncodedString()
.replacingOccurrences(of: "+", with: "-")
.replacingOccurrences(of: "/", with: "_")
.replacingOccurrences(of: "=", with: "")
}
// URL-safe Base64 decoding
func urlSafeBase64Decode(_ string: String) -> Data? {
let base64 = string
.replacingOccurrences(of: "-", with: "+")
.replacingOccurrences(of: "_", with: "/")
// Add padding if needed
let padding = String(repeating: "=", count: (4 - base64.count % 4) % 4)
return Data(base64Encoded: base64 + padding)
}
import android.util.Base64
// Kotlin
val text = "Hello, World!"
val encoded = Base64.encodeToString(text.toByteArray(), Base64.DEFAULT)
println(encoded) // SGVsbG8sIFdvcmxkIQ==
val decoded = String(Base64.decode(encoded, Base64.DEFAULT))
println(decoded) // Hello, World!
// Java
String text = "Hello, World!";
String encoded = Base64.encodeToString(text.getBytes(), Base64.DEFAULT);
System.out.println(encoded);
byte[] decoded = Base64.decode(encoded, Base64.DEFAULT);
String result = new String(decoded);
System.out.println(result);
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.util.Base64
import java.io.ByteArrayOutputStream
// Kotlin
fun bitmapToBase64(bitmap: Bitmap): String {
val outputStream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream)
val byteArray = outputStream.toByteArray()
return Base64.encodeToString(byteArray, Base64.DEFAULT)
}
fun base64ToBitmap(base64String: String): Bitmap? {
val decodedBytes = Base64.decode(base64String, Base64.DEFAULT)
return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
}
// Java
public String bitmapToBase64(Bitmap bitmap) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream);
byte[] byteArray = outputStream.toByteArray();
return Base64.encodeToString(byteArray, Base64.DEFAULT);
}
import android.util.Base64
// Kotlin
fun urlSafeBase64Encode(data: ByteArray): String {
return Base64.encodeToString(data, Base64.URL_SAFE or Base64.NO_PADDING)
}
fun urlSafeBase64Decode(base64String: String): ByteArray {
return Base64.decode(base64String, Base64.URL_SAFE or Base64.NO_PADDING)
}
// Java
public String urlSafeBase64Encode(byte[] data) {
return Base64.encodeToString(data, Base64.URL_SAFE | Base64.NO_PADDING);
}
public byte[] urlSafeBase64Decode(String base64String) {
return Base64.decode(base64String, Base64.URL_SAFE | Base64.NO_PADDING);
}
import Foundation
// Save Base64 to file
func saveBase64ToFile(_ base64String: String, filename: String) {
let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentsPath.appendingPathComponent(filename)
try? base64String.write(to: fileURL, atomically: true, encoding: .utf8)
}
// Load Base64 from file
func loadBase64FromFile(_ filename: String) -> String? {
let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileURL = documentsPath.appendingPathComponent(filename)
return try? String(contentsOf: fileURL, encoding: .utf8)
}
// Binary file to Base64
func fileToBase64(_ fileURL: URL) -> String? {
guard let data = try? Data(contentsOf: fileURL) else { return nil }
return data.base64EncodedString()
}
import android.content.Context
import android.util.Base64
import java.io.File
import java.io.FileOutputStream
import java.io.FileInputStream
// Kotlin
class Base64FileManager(private val context: Context) {
fun saveBase64ToFile(base64String: String, filename: String) {
val file = File(context.filesDir, filename)
file.writeText(base64String)
}
fun loadBase64FromFile(filename: String): String? {
val file = File(context.filesDir, filename)
return if (file.exists()) file.readText() else null
}
fun fileToBase64(filePath: String): String? {
val file = File(filePath)
if (!file.exists()) return null
val bytes = file.readBytes()
return Base64.encodeToString(bytes, Base64.DEFAULT)
}
}
Data.base64EncodedString() - Encode Data to Base64 stringData(base64Encoded:) - Decode Base64 string to DataString.data(using:) - Convert String to DataString(data:encoding:) - Convert Data to StringUIImage.jpegData(compressionQuality:) - Convert UIImage to JPEG DataUIImage(data:) - Create UIImage from DataBase64.encodeToString(byte[], flags) - Encode bytes to Base64Base64.decode(String, flags) - Decode Base64 to bytesBase64.DEFAULT - Standard encoding flagsBase64.URL_SAFE - URL-safe encodingBase64.NO_PADDING - No padding charactersBase64.NO_WRAP - No line breaks