我无法在Swift中找到解决这个问题的方法(它们都是Objective-C,并且它们处理的指针在Swift中我认为并不以相同的形式存在)。有什么办法可以将NSData
对象转换为[Uint8]
Swift形式的字节数组?
Answers:
如果以稍微复杂的方式遍历指针,或者通过Array
Swift 3中引入的新构造函数,则可以避免先将数组初始化为占位符值。
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))
Array()
依靠,NSArray
但我不认为这是...自NSArray
s以来,问题一直在尝试使用下标访问元素不知道它们包含哪种元素,而Swift却知道Array
。
let data : NSData! = "foo".data(using: String.Encoding.utf8)
[UInt8](data)
,自从最新的编辑以来,它已经在答案中了。(还有IMO带有显式类型的更清晰的语法。)
这很有趣,但是存在更简单的解决方案。可以在Swift 3中使用。我今天用过这个。
data: Data // as function parameter
let byteArray = [UInt8](data)
就这样!:) NSData可以轻松桥接到Data。
更新:(由于安德鲁·科斯特评论)
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”)
Swift 5解决方案
资料至[位元组]
extension Data {
var bytes : [UInt8]{
return [UInt8](self)
}
}
[bytes]至数据
extension Array where Element == UInt8 {
var data : Data{
return Data(self)
}
}
您可以使用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)
NSArray
我能发现的东西,bytes
访问器不会返回它。2)它将导致什么错误?如果您指的是NS*
类的可能不可用,请记住该问题指定NSData
。