Mav*_*vro 7 struct structure nsdata swift
我试图理解结构在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)")
Run Code Online (Sandbox Code Playgroud)
println返回:"data:<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)
Run Code Online (Sandbox Code Playgroud)
println(newData)是正确的,我期望值:<01020304>
但是,当我访问minorVersion时,它返回nil,而不是我预期的3.
有没有办法强制结构尊重字节的打包?
改成。Byte!Byte
否则,您将创建Optional<Byte>大于一个字节的结构体,因为除了保存一个字节之外,它还需要额外的字节来指示它是否是nil
注意:这可能仍然不起作用,因为您可能需要__attribute__((packed))告诉编译器如何处理对齐。AFAIK,它在 Swift 中不可用。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2420 次  |  
        
|   最近记录:  |