swift - 如何在 swift 3 中从 base64 获取字节数组?

标签 swift base64 byte decode

我正在使用 swift 3 将 Android 应用程序转换为 iOS。我的问题是下一段 Java 代码:

String b64 = "KJT-AAAhtAvQ";
byte[] bytesCodigo = Base64.decode(b64, Base64.URL_SAFE);
System.out.Println(bytesCodigo.length) // 9

在 swift 中会怎样?

谢谢

最佳答案

只需从 base64 字符串创建一个 Data(Objective-C 中的 NSData)。不过请注意,标准的 Data(base64Encoded:) 没有“URL 安全”格式,但您可以创建一个格式,将“-”替换为“+”,将“_”替换为“/”在尝试转换之前:

extension Data {
    init?(base64EncodedURLSafe string: String, options: Base64DecodingOptions = []) {
        let string = string
            .replacingOccurrences(of: "-", with: "+")
            .replacingOccurrences(of: "_", with: "/")

        self.init(base64Encoded: string, options: options)
    }
}

然后你可以这样做:

guard let data = Data(base64EncodedURLSafe: string) else { 
    // handle errors in decoding base64 string here
    return 
}

// use `data` here

显然,如果它不是“URL 安全”的 base64 字符串,您可以简单地执行以下操作:

guard let data = Data(base64Encoded: string) else { 
    // handle errors in decoding base64 string here
    return 
}

// use `data` here

您询问如何获得“字节数组”:Data 有效的是,只要 Data 类型符合 RandomAccessCollection 协议(protocol),就像 Array 类型一样。所以,如果你需要它们,你有许多“数组”类型的行为,例如:

for byte in data {
    // do something with `byte`, a `UInt8` value
}

let hexString = data.map { String(format: "%02x", $0) }
    .joined(separator: " ")

print(hexString)                        // 28 94 fe 00 00 21 b4 0b d0

因此,从本质上讲,您通常不需要“字节数组”,因为 Data 提供了对您可能需要的字节的所有访问方式。此外,无论如何,大多数处理二进制数据的 Swift API 都需要 Data 类型。


如果您真的需要一个[UInt8] 数组,您可以创建一个:

let bytes = data.map { $0 }

但是当 Data 提供人们通常需要的所有数组行为时,创建一个单独的字节数组(尤其是当二进制负载很大时)通常效率很低。

关于swift - 如何在 swift 3 中从 base64 获取字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286465/

相关文章:

javascript - 如何在 Javascript 中执行以 base64 编码的代码

python - 定长数据域和变长utf-8编码

c# - 保存图像文件和节省内存的最佳方式

ios - didMoveToSuperview 中调用的 UIView.animate 意外影响所有 subview

swift - 我可以创建一个 AppDelegate 实例吗?

ruby-on-rails - 在 Rails 中保存 Base64 字符串

vb.net - VB.NET-将MP3转换为Base64字符串

arrays - 为什么从 VBA 写入文件的字节会为每个字节添加 1100?

c - 这个 C 函数 int search(const char * const input_words[]) 的 swift 签名是什么以及如何从 Swift 调用它?

ios - 如何限制iOS按钮标题背景区域为0行?