Подтвердить что ты не робот

NSData для [Uint8] в Swift

Я не мог найти решение этой проблемы в Swift (все они Objective-C, и они имеют дело с указателями, которые, как я думаю, не существует в Swift в той же форме). Есть ли способ преобразовать объект NSData в массив байтов в форме [Uint8] в Swift?

4b9b3361

Ответ 1

Вы можете избежать первоначальной инициализации массива значениями-заполнителями, если вы проходите через указатели слегка запутанным способом или через новый конструктор Array, введенный в 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))

Ответ 2

Это смешно, но существуют более простые решения. Работает в Swift 3. Конечно. Я использовал это сегодня.

data: Data // as function parameter    
let byteArray = [UInt8](data)

Все это! :) NSData легко соединяется с данными.

ОБНОВЛЕНИЕ: (из-за комментария Эндрю Костера)

Swift 4.1, Xcode 9.3.1

Только что был перепроверен - все работает как положено.

if let nsData = NSData(base64Encoded: "VGVzdFN0cmluZw==", options: .ignoreUnknownCharacters) {
let bytes = [UInt8](nsData as Data)
print(bytes, String(bytes: bytes, encoding: .utf8))

Вывод: [84, 101, 115, 116, 83, 116, 114, 105, 110, 103] Необязательно ("TestString")

Ответ 3

Swift 5 Solution

Данные в [байты]

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

[байтов] в данные

extension Array where Element == UInt8 {
    var data : Data{
        return Data(self)
    }
}

Ответ 4

Вы можете использовать функцию getBytes NSData чтобы получить эквивалент байтового массива.

Поскольку вы не предоставили никакого исходного кода, я буду использовать содержимое Swift String, преобразованное в 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)

Свифт 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)

Ответ 5

Свифт 3/4

let data = Data(bytes: [0x01, 0x02, 0x03])
let byteArray: [UInt8] = data.map { $0 }

Ответ 6

Ты можешь попробовать

extension Data {
func toByteArray() -> [UInt8]? {
    var byteData = [UInt8](repeating:0, count: self.count)
    self.copyBytes(to: &byteData, count: self.count)
    return byteData
  }
}

Ответ 7

swift 4 и данные изображения в байтовый массив.

 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

}