NSData from Byte array in Swift

匿名 (未验证) 提交于 2019-12-03 01:56:01

问题:

I'm trying to create an NSData var from an array of bytes.

In Obj-C I might have done this:

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

I can't figure out a working equivalent in Swift.

回答1:

NSData has an initializer that takes a bytes pointer: init(bytes: UnsafeMutablePointer , length: Int). An UnsafePointer parameter can accept a variety of different things, including a simple Swift array, so you can use pretty much the same syntax as in Objective-C. When you pass the array, you need to make sure you identify it as a UInt8 array or Swift's type inference will assume you mean to create an Int array.

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

You can read more about unsafe pointer parameters in Apple's Interacting with C APIs documentation.



回答2:

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

outputs: ff d9

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

outputs: ff d9

Edit: Ah, you have to write 'as Byte[]', so then the results are the same


UPDATED for Swift 2.2

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

outputs: ff d9

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

outputs: ff d9



回答3:

You don't need to extend Data, in Swift 3 you can do this:

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

Prints ""

To get the byte array again:

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


回答4:

Swift 3 extension

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

Usage

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!