继续我原来的帖子: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
}
我收到一条警告:“还不支持固定长度数组”。
无论如何要解决这个限制?
答案 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会对二进制表示做出任何保证 它的结构,所以今后可能会破裂。