我试图了解结构在 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 返回:“数据:<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 时,它返回 nil,而不是我预期的 3。
有没有办法强制结构遵守字节的打包?
最佳答案
更改 Byte!
至 Byte
.
否则您将创建结构持有 Optional<Byte>
它大于一个字节,因为除了保存一个字节外,它还需要额外的字节来指示它是否是 nil
注意:这可能仍然无法正常工作,因为您可能需要像 __attribute__((packed))
这样的东西告诉编译器如何处理对齐。 AFAIK,它在 Swift 中不可用。
关于swift - 在 SWIFT 中使用结构(字节)- 结构到 NSData 和 NSData 到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27285887/