从字节数组到结构的对话。 Swift
Converation from array of Bytes to Struct. Swift
我有字节转储,我需要解析结构
C++ 示例:
(*(SomeStruct*)(bufPtr))
如何在 swift 上完成?
你的 C 代码相当于:
let s = UnsafePointer<SomeStruct>(bufPtr).memory
(假设 bufPtr
的类型 UnsafePointer
有一个未命名的参数初始值设定项 - 如果不是,您可能需要另一个特定的初始值设定项,或者做更多的强制转换。)
适用于 C/C++ 的警告同样适用于此处,即如果结果 bufPtr
没有指向 SomeStruct
,你会很抱歉。
另一方面,如果你想一个一个地遍历字节,你可以创建一个 var ptr = UnsafePointer<UInt8>(bufPtr)
,它可以像 C 指针一样被索引和递增(即 ptr[i]
和 ++ptr
).
如果你事先知道你读取了多少字节,你也可以把它放在一个缓冲区 (let buf = UnsafeBufferPointer(start: ptr, count: i)
) 中,这样你就可以像对待普通集合一样对待它 (与 for-in
一起使用, map
, find
等)。同样,关键在名字中——如果你把计数搞砸了,这是不安全的。
我有字节转储,我需要解析结构
C++ 示例:
(*(SomeStruct*)(bufPtr))
如何在 swift 上完成?
你的 C 代码相当于:
let s = UnsafePointer<SomeStruct>(bufPtr).memory
(假设 bufPtr
的类型 UnsafePointer
有一个未命名的参数初始值设定项 - 如果不是,您可能需要另一个特定的初始值设定项,或者做更多的强制转换。)
适用于 C/C++ 的警告同样适用于此处,即如果结果 bufPtr
没有指向 SomeStruct
,你会很抱歉。
另一方面,如果你想一个一个地遍历字节,你可以创建一个 var ptr = UnsafePointer<UInt8>(bufPtr)
,它可以像 C 指针一样被索引和递增(即 ptr[i]
和 ++ptr
).
如果你事先知道你读取了多少字节,你也可以把它放在一个缓冲区 (let buf = UnsafeBufferPointer(start: ptr, count: i)
) 中,这样你就可以像对待普通集合一样对待它 (与 for-in
一起使用, map
, find
等)。同样,关键在名字中——如果你把计数搞砸了,这是不安全的。