我试图了解结构在SWIFT中是如何工作的。我熟悉.NET如何处理它们以及如何将字节打包到结构中等等。
我发现以下代码有些奇怪:
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返回:&#34;数据:&lt; 01000200 03000400&gt;&#34;
我期待数据实际上是:&#34;数据:&lt; 01020304&gt;&#34;
知道为什么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)是正确的以及我期望的价值:&lt; 01020304&gt;
然而,当我访问minorVersion时,它返回nil,而不是我预期的3。
有没有办法强制结构尊重字节的打包?
答案 0 :(得分:2)
将Byte!
更改为Byte
。
否则,您创建的结构保持Optional<Byte>
大于一个字节,因为除了保持一个字节外,还需要额外的字节来指示它是否为nil
注意:这可能仍然无法正常工作,因为您可能需要__attribute__((packed))
这样的内容来告诉编译器如何处理对齐。 AFAIK,它在Swift中不可用。