我在Swift中找不到解决这个问题的方法(所有解决方法都是使用Objective-C,并且涉及指针,我认为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 5 解决方案
将数据转换为 [字节]
extension Data {
var bytes: [UInt8] {
return [UInt8](self)
}
}
[字节] 转换为 数据
extension Array where Element == UInt8 {
var data: Data {
return Data(self)
}
}
很有趣,但有更简单的解决方案。在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] Optional("TestString")
你可以使用NSData的getBytes
函数获取字节数组的等价物。
由于您没有提供任何源代码,我将使用已转换为NSData的Swift字符串内容。
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)
Swift 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 3/4
let data = Data(bytes: [0x01, 0x02, 0x03])
let byteArray: [UInt8] = data.map { $0 }
将Swift 4和图像数据转换为字节数组。
func getArrayOfBytesFromImage(imageData:Data) ->[UInt8]{
let count = imageData.count / MemoryLayout<UInt8>.size
var byteArray = [UInt8](repeating: 0, count: count)
imageData.copyBytes(to: &byteArray, count:count)
return byteArray
}
你可以尝试一下
extension Data {
func toByteArray() -> [UInt8]? {
var byteData = [UInt8](repeating:0, count: self.count)
self.copyBytes(to: &byteData, count: self.count)
return byteData
}
}
NSArray
,bytes
访问器也没有返回它。2)如果你指的是可能会在后面出现的错误,那么请记住问题中指定了NSData
,而不是NS*
类的可能不可用性。 - ArkkuArray()
是依赖于NSArray
的,但我现在觉得不是这样的... 问题产生在接下来尝试使用下标访问元素时,因为NSArray
无法知道它们包含的元素类型,而Swift的Array
可以。 - califrenchlet data : NSData! = "foo".data(using: String.Encoding.utf8)
。 - Arkku[UInt8](data)
,自最新编辑以来已经包含在答案中了。(而且我认为这是更清晰的语法,具有显式类型。) - Arkku