2014-12-04 13 views
6

Próbuję zrozumieć, jak działają struktury w SWIFT. Jestem pewny, jak .NET obsługuje je i jak to pakuje bajty do struktury itpUżywanie struktur (bajtów) z SWIFT - Struct do NSData i NSData do Struct

jestem znalezieniem trochę tajemniczości z następującego kodu:

struct exampleStruct { 
    var ModelNumber: Byte! 
    var MajorVersion: Byte! 
    var MinorVersion: Byte! 
    var Revision: Byte! 
} 


var myStruct = exampleStruct (
    ModelNumber: 1, 
    MajorVersion: 2, 
    MinorVersion: 3, 
    Revision: 4 
) 

myStruct.MinorVersion // << Returns 3 

// Struct to NSData. 
var data = NSData(
    bytes: &myStruct, 
    length: sizeof(exampleStruct) 
) 

println("data: \(data)") 

W println Powroty: „Dane: < 01000200 03000400>”

spodziewałem dane faktycznie być:«dane: < 01020304>»

Każdy pomysł dlaczego SWIFT nie jest pakowania 1 bajt jako 1 bajt, zamiast to pakowanie bajt jako 2 bajty (1 bajt wartości i 1 bajt jako 00)?

Z drugiej strony, jeśli I wykonaj następujące czynności:

var newStruct = exampleStruct(ModelNumber: nil, MajorVersion: nil, MinorVersion: nil, Revision: nil) 

var sendBytes:[Byte] = [0x1, 0x2, 0x3, 0x4] 
var newData = NSData(bytes: sendBytes, length: sendBytes.count) 

newData.getBytes(
    &newStruct, 
    length: sizeof(exampleStruct) 
) 

newStruct.MinorVersion // << Returns nil 

println(newData) 

println (newData) jest prawidłowy i czego oczekuję wartości: < 01020304>

Jednak, kiedy dostęp do MinorVersion it zwraca zero, a nie to, czego oczekiwałem jako 3.

Czy istnieje sposób zmuszenia konstrukcji do przestrzegania upakowania bajta?

Odpowiedz

2

Zmień Byte! na Byte.

Inaczej tworzysz struct gospodarstwa Optional<Byte>, który jest większy niż jeden bajt, ponieważ oprócz posiadania bajt, że potrzebne są dodatkowe bajt, aby wskazać, czy jest nil

Uwaga: To może jeszcze nie działa jak może być konieczne coś jak __attribute__((packed)), aby powiedzieć kompilatorowi, jak radzić sobie z wyrównaniem. AFAIK, nie jest dostępny w Swift.

+0

Dzięki! To działało i dziękuję za wyjaśnienie, ma to sens. – Mavro