我在Swift中找不到解决这个问题的方法(所有这些都是Objective-C,它们处理的指针在Swift中以相同的形式存在)。有没有办法在Swift中将NSData
对象转换为[Uint8]
形式的字节数组?
如果以稍微复杂的方式查看指针,或者通过Swift 3中引入的新Array
构造函数,您可以避免首先将数组初始化为占位符值:
let data = "foo".data(using: .utf8)!
// new constructor:
let array = [UInt8](data)
// …or old style through pointers:
let array = data.withUnsafeBytes {
[UInt8](UnsafeBufferPointer(start: $0, count: data.count))
}
Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))
这很有趣,但存在更简单的解决方案。在Swift中工作3.当然。我今天用过这个。
data: Data // as function parameter
let byteArray = [UInt8](data)
就这样! :) NSData很容易桥接到Data。
更新:(由于Andrew Koster评论)
Swift 4.1,Xcode 9.3.1
刚刚重新检查 - 所有工作都按预期进行。
if let nsData = NSData(base64Encoded: "VGVzdFN0cmluZw==", options: .ignoreUnknownCharacters) {
let bytes = [UInt8](nsData as Data)
print(bytes, String(bytes: bytes, encoding: .utf8))
输出:[84,101,115,116,83,116,114,105,110,103]可选(“TestString”)
您可以使用getBytes
的NSData
函数来获得等效的字节数组。
由于您没有提供任何源代码,我将使用已转换为NSData的Swift String内容。
var string = "Hello World"
let data : NSData! = string.dataUsingEncoding(NSUTF8StringEncoding)
let count = data.length / sizeof(UInt8)
// create an array of Uint8
var array = [UInt8](count: count, repeatedValue: 0)
// copy bytes into array
data.getBytes(&array, length:count * sizeof(UInt8))
println(array)
斯威夫特3/4
let count = data.length / MemoryLayout<UInt8>.size
// create an array of Uint8
var byteArray = [UInt8](repeating: 0, count: count)
// copy bytes into array
data.getBytes(&byteArray, length:count)
Swift 5解决方案
数据到[字节]
extension Data {
var bytes : [UInt8]{
return [UInt8](self)
}
}
[字节]到数据
extension Array where Element == UInt8 {
var data : Data{
return Data(self)
}
}
斯威夫特3/4
let data = Data(bytes: [0x01, 0x02, 0x03])
let byteArray: [UInt8] = data.map { $0 }
你可以试试
extension Data {
func toByteArray() -> [UInt8]? {
var byteData = [UInt8](repeating:0, count: self.count)
self.copyBytes(to: &byteData, count: self.count)
return byteData
}
}