来自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)