iOS 与 Android 的 Base64

本文介绍在 iOS(Swift)与 Android(Kotlin/Java)移动开发中的 Base64 编码/解码用法, 包含常用原生 API、常见模式以及移动应用的实用示例。

概览

iOS 与 Android 均提供内置的 Base64 支持:iOS 侧常用 DataString 扩展, Android 侧使用 Base64 工具类。本文涵盖字符串、二进制数据与图片的编码/解码,适配移动端场景。

iOS(Swift)示例

基础字符串 编码/解码

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!
}

图片与 Base64

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!)

URL 安全的 Base64

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)
}

Android(Kotlin/Java)示例

基础字符串 编码/解码

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);

图片与 Base64

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);
}

URL 安全的 Base64

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);
}

文件 I/O 示例

iOS 文件操作

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()
}

Android 文件操作

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)
    }
}

API 参考

iOS Base64 APIs

  • Data.base64EncodedString() - 将 Data 编码为 Base64 字符串
  • Data(base64Encoded:) - 将 Base64 字符串解码为 Data
  • String.data(using:) - 将 String 转为 Data
  • String(data:encoding:) - 将 Data 转为 String
  • UIImage.jpegData(compressionQuality:) - 将 UIImage 转为 JPEG Data
  • UIImage(data:) - 由 Data 创建 UIImage

Android Base64 APIs

  • Base64.encodeToString(byte[], flags) - 将字节编码为 Base64
  • Base64.decode(String, flags) - 将 Base64 解码为字节
  • Base64.DEFAULT - 标准编码标志
  • Base64.URL_SAFE - URL 安全编码
  • Base64.NO_PADDING - 不使用填充字符
  • Base64.NO_WRAP - 不换行

最佳实践