来自Swift中Byte数组的NSData

我试图从一个字节数组中创build一个NSData var

在Obj-C中,我可能会这样做:

NSData *endMarker = [[NSData alloc] initWithBytes:{ 0xFF, 0xD9 }, length: 2]

我无法弄清楚Swift中的一个等价物。

NSData有一个初始化程序,它需要一个bytes指针: init(bytes: UnsafeMutablePointer <Void>, length: Int) 。 一个UnsafePointer参数可以接受各种不同的东西,包括一个简单的Swift数组,所以你可以使用与Objective-C几乎相同的语法。 当你传递数组的时候,你需要确保你把它标识为UInt8数组,否则Swift的types推断将假设你的意思是创build一个Int数组。

 var endMarker = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2) 

您可以在Apple的C API文档交互中阅读有关不安全指针参数的更多信息。

 var foo : Byte[] = [0xff, 0xD9] var data = NSData(bytes: foo, length: foo.count) println("\(data)") 

输出:ff d9

 var data = NSData(bytes: [0xFF, 0xD9] as Byte[], length: 2) println("\(data)") 

输出:ff d9

编辑:啊,你必须写'作为字节[]',那么结果是一样的


更新了Swift 2.2

 var foo:[UInt8] = [0xff, 0xD9] var data = NSData(bytes: foo, length: foo.count) print("\(data)") 

输出:ff d9

 var data = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2) print("\(data)") 

输出:ff d9

Swift 3扩展

 extension Data { init<T>(fromArray values: [T]) { var values = values self.init(buffer: UnsafeBufferPointer(start: &values, count: values.count)) } func toArray<T>(type: T.Type) -> [T] { return self.withUnsafeBytes { [T](UnsafeBufferPointer(start: $0, count: self.count/MemoryLayout<T>.stride)) } } } 

用法

 let bytes:[UInt8] = [0x00, 0xf4, 0x7c] let data = Data(fromArray: someBytes) print(data as NSData) let bytes = data.toArray(type: UInt8.self) print(bytes) 

你不需要扩展数据,在Swift 3中你可以这样做:

 let bytes:[UInt8] = [0x00, 0x01, 0x02, 0x03]; let data = Data(bytes: bytes); print(data as NSData); 

打印“<00010203>”

再次获取字节数组:

 let byteArray:[UInt8] = [UInt8](data)