0%

Swift下二进制读取

在处理网络协议等一些二进制数据时,一般都是 C 或 C++ 擅长的领域,怎么在 swift 方便的读取二进制的信息呢?

定义

1
2
3
4
5
6
7
8
public struct Payload {
// 保存当前位置
public var pos: Int

// 保存二进制数据
var data: Data

}

固定长度数值的读取方法

1
2
3
4
5
6
7
8
9
mutating func read<T: FixedWidthInteger>(_ type: T.Type) -> T {
let size = MemoryLayout<T>.size

let value = self.data[self.pos...size].withUnsafeBytes({ p -> T in
return p.load(as: T.self).bigEndian
})
self.pos += size
return value
}

固定长度数值的写入方法

1
2
3
4
5
6
mutating func write<T: FixedWidthInteger>(_ value: T) {
var source = value.littleEndian
let d = Data(bytes: &source, count: MemoryLayout<T>.size)
self.data.append(d)
}