NSData from Byte array in Swift

前端 未结 5 1510
闹比i
闹比i 2020-12-13 18:15

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

In Obj-C I might have done this:

NSData *endMarker = [[NSData al

相关标签:
5条回答
  • 2020-12-13 18:32
    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

    0 讨论(0)
  • 2020-12-13 18:34

    NSData has an initializer that takes a bytes pointer: init(bytes: UnsafeMutablePointer <Void>, 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.

    0 讨论(0)
  • 2020-12-13 18:37

    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 "<00010203>"

    To get the byte array again:

    let byteArray:[UInt8] = [UInt8](data)
    
    0 讨论(0)
  • 2020-12-13 18:41

    Swift 3 extension

    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))
            }
        }
    }
    

    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)
    
    0 讨论(0)
  • 2020-12-13 18:55

    For Swift 5 I have created another Data extension that works well.

    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] {
            let value = self.withUnsafeBytes {
                $0.baseAddress?.assumingMemoryBound(to: T.self)
            }
            return [T](UnsafeBufferPointer(start: value, count: self.count / MemoryLayout<T>.stride))
        }
    
    }
    

    Sample Usage

    let data = Data(fromArray: [1, 2, 3, 4, 5])
    let array = data.toArray(type: Int.self)
    print(array)
    // [1, 2, 3, 4, 5]
    
    0 讨论(0)
提交回复
热议问题