Я пытаюсь создать NSData
var
из массива байтов.
В Obj-C я мог бы сделать это:
NSData *endMarker = [[NSData alloc] initWithBytes:{ 0xFF, 0xD9 }, length: 2]
Я не могу определить рабочий эквивалент в Swift.
Я пытаюсь создать 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, предположим, что вы хотите создать массив Int
.
var endMarker = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2)
Подробнее о небезопасных параметрах указателя можно прочитать в документации Apple Взаимодействие с API-интерфейсом 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
Изменить: Ах, вам нужно написать 'как Byte []', так что результаты будут одинаковыми
ОБНОВЛЕНО для 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
Вам не нужно расширять Data, в Swift 3 вы можете сделать это:
let bytes:[UInt8] = [0x00, 0x01, 0x02, 0x03]
let data = Data(bytes: bytes)
print(data as NSData)
Отпечатки "<00010203>"
Чтобы снова получить байтовый массив:
let byteArray:[UInt8] = [UInt8](data)
Расширение 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 5 я создал другое расширение Data
которое работает хорошо.
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))
}
}
Образец использования
let data = Data(fromArray: [1, 2, 3, 4, 5])
let array = data.toArray(type: Int.self)
print(array)
// [1, 2, 3, 4, 5]