2014-12-04 60 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