我正在使用 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/