swift - 在 SWIFT 中使用结构(字节)- 结构到 NSData 和 NSData 到结构

标签 swift struct structure nsdata

我试图了解结构在 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/

相关文章:

iOS 编程菜鸟,需要帮助修复错误消息

c++ - OpenCL - 需要推荐的结构

html - 容器之前的 Bootstrap header

swift - 如何将 UItapGesture 识别器指定为按钮的 CGpoint

ios - UITableViewCell 中的多行标签不适用于 iOS 9 或 Swift 2.0

xcode - 如何初始化相互依赖的属性

c++ - 为类成员函数的结构输入设置默认值

go - 结构在 for 循环初始化器中

c - 使用 union 的名称访问 union 成员

java - WhiteSpaceProcessor 上的另一个奇怪的 NoClassDefFoundError