继续我原来的帖子: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
}
我收到一条警告:“尚不支持固定长度数组”。
有办法解决这个限制吗?
最佳答案
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 ...
}
所以这不仅仅是一个字节的“C 数组”。实际存储是不透明的并且仅 可通过方法和属性访问。
您可以定义固定大小的元组:
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 对二进制表示做出任何保证 它的结构,所以这可能会在未来崩溃。
关于swift - 将结构(包括字节数组)与 SWIFT 结合使用 - 结构到 NSData 和 NSData 到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304094/