swift - 将结构(包括字节数组)与 SWIFT 结合使用 - 结构到 NSData 和 NSData 到结构

标签 swift struct byte arrays 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
}

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

有办法解决这个限制吗?

最佳答案

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/

相关文章:

ios - CFNetwork 在 iOS 中使用 swift 崩溃

c - 将递归 C 结构移植到 Fortran

go - 包装结构引用

json - 试图比较任何?带字符串

swift - 任何碰撞游戏结束 - Swift Spritekit

c - 在线程函数中取消引用结构数组?

C# 将字节数组 append 到现有文件

c++ - 将 unsigned char[] 解析为 std::string

具有 0x00 字符的 C++ 数据数组

ios - 如何在单击按钮时在 SwiftUI 中为 TextField 设置文本