NSData to [Uint8] in Swift

后端 未结 7 729
无人及你
无人及你 2020-12-04 17:24

I couldn\'t find a solution to this problem in Swift (all of them are Objective-C, and they deal with pointers which I don\'t think exist in Swift in the same form). Is ther

相关标签:
7条回答
  • 2020-12-04 17:55

    You can avoid first initialising the array to placeholder values, if you go through pointers in a slightly convoluted manner, or via the new Array constructor introduced in Swift 3:

    Swift 3

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

    Swift 2

    Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))
    
    0 讨论(0)
  • 2020-12-04 17:56

    You can use the getBytes function of NSData to get the byte array equivalent.

    As you did not provide any source code, I will use a Swift String contents that has been converted to NSData.

    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)
    
    0 讨论(0)
  • 2020-12-04 17:58

    You can try

    extension Data {
    func toByteArray() -> [UInt8]? {
        var byteData = [UInt8](repeating:0, count: self.count)
        self.copyBytes(to: &byteData, count: self.count)
        return byteData
      }
    }
    
    0 讨论(0)
  • 2020-12-04 17:59

    Swift 5 Solution

    Data to [bytes]

    extension Data {
        var bytes : [UInt8]{
            return [UInt8](self)
        }
    }
    

    [bytes] to Data

    extension Array where Element == UInt8 {
        var data : Data{
            return Data(self)
        }
    }
    
    0 讨论(0)
  • 2020-12-04 18:01

    swift 4 and image data to a byte array.

     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
    
    }
    
    0 讨论(0)
  • 2020-12-04 18:03

    Swift 3/4

    let data = Data(bytes: [0x01, 0x02, 0x03])
    let byteArray: [UInt8] = data.map { $0 }
    
    0 讨论(0)
提交回复
热议问题