2014-06-13 10 views
25

Próbuję utworzyć NSDatavar z tablicy bajtów.NSData z tablicy bajtowej w Swift

W Obj-C mogę tego zrobić:

NSData *endMarker = [[NSData alloc] initWithBytes:{ 0xFF, 0xD9 }, length: 2]

nie mogę wymyślić równowartość pracy w Swift.

Odpowiedz

60

NSData ma inicjator, który ma wskaźnik bytes: init(bytes: UnsafeMutablePointer <Void>, length: Int). Parametr UnsafePointer może akceptować wiele różnych rzeczy, w tym prostą tablicę Swift, więc możesz użyć prawie tej samej składni co w Objective-C. Po przejściu przez tablicę musisz upewnić się, że identyfikujesz ją jako tablicę typu UInt8 lub jej typ Inference zakłada, że ​​masz zamiar utworzyć tablicę Int.

var endMarker = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2) 

Możesz przeczytać więcej o niebezpiecznych parametrów wskaźnikowych w dokumentacji Apple Interacting with C APIs.

+0

Tak też myślałem. Ale kiedy wydrukuję to w debugerze, otrzymam: ; i jeśli zrobię więcej bajtów, otrzymam to samo, wszystkie 00 po pierwszym bajcie. – Jeff

+1

Dodano informacje o typie do tablicy - wysyłano tablicę 'Int' zamiast tablicy' Byte'. –

+0

Aby dodać, 'Byte' został usunięty w swift1.2, zamiast tego użyj' UInt8'. – mash

13
var foo : Byte[] = [0xff, 0xD9] 

var data = NSData(bytes: foo, length: foo.count) 

println("\(data)") 

wyjścia: ff D9

var data = NSData(bytes: [0xFF, 0xD9] as Byte[], length: 2) 

println("\(data)") 

wyjścia: ff D9

EDIT: Ah, trzeba napisać 'jako Byte []', więc wtedy wyniki są takie same


aktualizowana Swift 2.2

var foo:[UInt8] = [0xff, 0xD9] 
var data = NSData(bytes: foo, length: foo.count) 
print("\(data)") 

wyjścia: ff D9

var data = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2) 
print("\(data)") 

wyjścia: ff D9

+2

Wygląda na to, że nie możesz już używać 'Byte' w Swift 1.2 Zamiast" Byte [] ", napisz' [Uint8] ' –

+0

Nie, to jest' UInt8' (pisownia) –

6

Swift 3 przedłużenia

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

Zastosowanie

let bytes:[UInt8] = [0x00, 0xf4, 0x7c] 
let data = Data(fromArray: someBytes) 
print(data as NSData) 

let bytes = data.toArray(type: UInt8.self) 
print(bytes) 
7

Nie trzeba rozszerzyć danych, Swift 3 można to zrobić:

let bytes:[UInt8] = [0x00, 0x01, 0x02, 0x03]; 
let data = Data(bytes: bytes); 
print(data as NSData); 

< 00010203 Wydruki ">"

aby uzyskać tablicę bajtów ponownie:

let byteArray:[UInt8] = [UInt8](data)