2014-12-04 88 views
6

我想了解結構如何在SWIFT內工作。我熟悉.NET如何處理,以及如何它包成字節的結構等使用結構(字節)和SWIFT - 結構到NSData和NSData結構

我發現一些古怪用下面的代碼:

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

println的回報:「數據: < 01000200 03000400>」

我期待的數據實際上是:‘數據顯示:< 01020304>’

任何想法,爲什麼SWIFT是不是打包1個字節爲1個字節,而不是它的包裝一個字節作爲2個字節(1個字節的值和1個字節爲00)?

,如果我做了以下的另一面:

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)是正確的,我所期望的價值:< 01020304>

然而,當我訪問minorVersion它返回零,不是我期待的3.

有沒有辦法強制結構尊重一個字節的打包?

回答

2

更改Byte!Byte

否則要創建結構保持Optional<Byte>是大於一個字節,因爲除了舉辦一個字節,它需要額外的字節來表示,如果它是nil

注:這可能仍無法正常工作,你可能需要例如__attribute__((packed))來告訴編譯器如何處理對齊。 AFAIK,它在Swift中不可用。

+0

謝謝!這工作,並感謝澄清,這是有道理的。 – Mavro 2014-12-04 03:50:11