引言
在重构公司项目的过程中发现 swift 开发自定义协议往往需要使用NSData转换后才能使用,考虑到重构的目标是尽量不使用oc的数据类型特别研究了一下。
构造数据包
在这里我们使用Swift的指针类型进行数据包的转换具体代码如下:
func getPacket(pointer:UnsafeRawPointer,data:Data!,size:Int) -> Data? {
//根据结构体构造Data数据
var ahpack:Data = Data(bytes: pointer, count:size)
//添加附加数据
if data != nil{
ahpack.append(data!)
}
return ahpack
}
//自定义协议包头
struct Prototype {
let param1:UInt16
let param2:UInt16
let param3:UInt16
let param4:UInt16
}
//调用
//构造包结构体
var packetStruct = Prototype(param1: 1,param2: 2,param3: 3,param4: 4)
//生成协议包
print(getPacket(pointer: &packetStruct, data: nil, size: MemoryLayout.size(ofValue: packetStruct)))
解析数据包
//从data转换结构体指针
func getStruct(pointer:UnsafePointer<UInt8>)->UnsafePointer<Prototype>.Pointee{
unsafeBitCast(pointer, to: UnsafePointer<Prototype>.self).pointee
}
//使用
let structs = getStruct(pointer: &data)
print("param1:\(structs.param1)\nparam2:\(structs.param2)\nparam3:\(structs.param3)\nparam4:\(structs.param4)")