Próbuję utworzyć NSData
var
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.
Próbuję utworzyć NSData
var
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.
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.
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
Wygląda na to, że nie możesz już używać 'Byte' w Swift 1.2 Zamiast" Byte [] ", napisz' [Uint8] ' –
Nie, to jest' UInt8' (pisownia) –
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)
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)
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
Dodano informacje o typie do tablicy - wysyłano tablicę 'Int' zamiast tablicy' Byte'. –
Aby dodać, 'Byte' został usunięty w swift1.2, zamiast tego użyj' UInt8'. – mash