使用Structs(包括字节数组)和SWIFT - Struct到NSData和NSData到Struct

时间:2014-12-04 21:07:33

标签: swift struct byte bytearray nsdata

继续我原来的帖子:Using Structs (Bytes) with SWIFT - Struct to NSData and NSData to Struct

我现在发现,如果我的字节结构与字节数组合,则无法正确打包。

示例代码:

struct exampleStruct {
    var ModelNumber: Byte
    var MajorVersion: Byte
    var MinorVersion: Byte
    var Revision: Byte
    var Message: [Byte]
}

var myStruct = exampleStruct (
    ModelNumber: 1,
    MajorVersion: 2,
    MinorVersion: 3,
    Revision: 4,
    Message: [0x48, 0x45, 0x4C, 0x4C, 0x4F] // HELLO
)

println(myStruct.Message)返回值为[72,69,76,76,79]

的正确数组

但是,当我使用:

将此结构转换为NSData时
// Struct to NSData.
var data = NSData(
    bytes: & myStruct,
    length: sizeof(exampleStruct)
)

我得到了意想不到的结果: “数据:< 01020304 00000000 108c91fd a87f0000>”。我期待“数据:< 01020304 48454c4c 4f>”

这似乎是因为没有设置[Byte]数组长度。可以在SWIFT中设置吗?当我尝试以下内容时:

struct exampleStruct {
   var ModelNumber: Byte
   var MajorVersion: Byte
   var MinorVersion: Byte
   var Revision: Byte
   var Message: Byte[5] // << Set array length 5
}

我收到一条警告:“还不支持固定长度数组”。

无论如何要解决这个限制?

1 个答案:

答案 0 :(得分:2)

var Message: [Byte]声明了struct Array类型的变量:

struct Array<T> : MutableCollectionType, Sliceable {

    /// The type of element stored by this `Array`
    typealias Element = T

    /// Always zero, which is the index of the first element when non-empty.
    var startIndex: Int { get }

    /// A "past-the-end" element index; the successor of the last valid
    /// subscript argument.
    var endIndex: Int { get }
    subscript (index: Int) -> T

    // ... and much more ...
}

所以这不仅仅是一个&#34; C阵列&#34;的字节数。实际存储只是不透明的 通过方法和属性可以访问。

您可以定义固定大小的元组

struct exampleStruct {
    var ModelNumber: Byte
    var MajorVersion: Byte
    var MinorVersion: Byte
    var Revision: Byte
    var Message: (Byte, Byte, Byte, Byte, Byte)
}

var myStruct = exampleStruct (
    ModelNumber: 1,
    MajorVersion: 2,
    MinorVersion: 3,
    Revision: 4,
    Message: (0x48, 0x45, 0x4C, 0x4C, 0x4F) // HELLO
)
var data = NSData(
    bytes: &myStruct,
    length: sizeof(exampleStruct)
)

println(data) // <01020304 48454c4c 4f>

但是,我并不认为Swift会对二进制表示做出任何保证 它的结构,所以今后可能会破裂。