只需从 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 协议,就像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 提供通常需要的所有数组行为等等时,创建单独的字节数组通常效率低下(尤其是当二进制有效负载很大时)。