由于Swift 3倾向于Data而不是[UInt8],我试图找出最有效/惯用的编码/解码方式将各种数字类型(UInt8,Double,Float,Int64等)作为数据对象.
对于使用[UInt8]有这个答案,但它似乎使用了我在Data上找不到的各种指针API.
我想基本上一些自定义扩展看起来像:
let input = 42.13 // implicit Double
let bytes = input.data
let roundtrip = bytes.to(Double) // --> 42.13
Run Code Online (Sandbox Code Playgroud)
真正逃避我的部分,我已经查看了一堆文档,我是如何从任何基本结构(所有数字都是)得到某种指针的东西(OpaquePointer或BufferPointer或UnsafePointer?).在C中,我只是在它前面拍一个&符号,然后就去了.
我正在尝试使用该方法将其读Data入Swift 4 .问题structwithUnsafeBytes
网络UDP数据包具有以下格式:
data: 0102 0A00 0000 0B00 0000
01 : 1 byte : majorVersion (decimal 01)
02 : 1 byte : minorVersion (decimal 02)
0A00 0000 : 4 bytes: applicationHostId (decimal 10)
0B00 0000 : 4 bytes: versionNumber (decimal 11)
Run Code Online (Sandbox Code Playgroud)
然后我有一个扩展Data,需要一个start和length几个字节来读取
extension Data {
func scanValue<T>(start: Int, length: Int) -> T {
return self.subdata(in: start..<start+length).withUnsafeBytes { $0.pointee }
}
}
Run Code Online (Sandbox Code Playgroud)
这在逐个读取值时正常工作:
// correctly read as decimal "1"
let …Run Code Online (Sandbox Code Playgroud)