将结构(包括字节数组)与SWIFT-Struct-to-NSData和NSData-to-Struct一起使用
继续我原来的职务: 我现在发现,如果我有一个包含字节的结构和一个字节数组,它就不能正确打包 示例代码:将结构(包括字节数组)与SWIFT-Struct-to-NSData和NSData-to-Struct一起使用,swift,struct,byte,bytearray,nsdata,Swift,Struct,Byte,Bytearray,Nsdata,继续我原来的职务: 我现在发现,如果我有一个包含字节的结构和一个字节数组,它就不能正确打包 示例代码: struct exampleStruct { var ModelNumber: Byte var MajorVersion: Byte var MinorVersion: Byte var Revision: Byte var Message: [Byte] } var myStruct = exampleStruct ( ModelNumbe
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)
)
我得到了以下意想不到的结果:
“数据:”。我在等“数据”:
这似乎是因为没有设置[Byte]数组长度。可以用SWIFT设置吗?当我尝试以下方法时:
struct exampleStruct {
var ModelNumber: Byte
var MajorVersion: Byte
var MinorVersion: Byte
var Revision: Byte
var Message: Byte[5] // << Set array length 5
}
struct示例struct{
var模型编号:字节
变量主版本:字节
var MinorVersion:字节
变量修订:字节
变量消息:字节[5]/var消息:[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 ...
}
结构数组:MutableCollectionType,可切片{
///此数组存储的元素类型`
typealias元素=T
///始终为零,这是非空时第一个元素的索引。
var startIndex:Int{get}
///一种“超过末尾”的元素索引;最后一个有效索引的后继索引
///下标参数。
var endIndex:Int{get}
下标(索引:Int)->T
//……还有更多。。。
}
所以这不仅仅是一个字节的“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>
struct示例struct{
var模型编号:字节
变量主版本:字节
var MinorVersion:字节
变量修订:字节
var消息:(字节,字节,字节,字节,字节)
}
var myStruct=examplestuct(
型号:1,
主要版本:2,
结论:3,
修订:4,
消息:(0x48、0x45、0x4C、0x4C、0x4F)//您好
)
var数据=NSData(
字节:&myStruct,
长度:sizeof(示例结构)
)
println(数据)//
然而,我不认为Swift对二进制表示做出任何保证
这是一个Swift结构数组,而不是C数组。这太棒了-谢谢!出于某种原因,我一直认为Swift与C比实际更相似。@Mavro:不客气。–如果您需要一个定义良好的表示形式(例如用于数据交换)然后,通过定义C结构并将其导入Swift(或定义自己的封送处理函数),您可能更安全。