从struct Data快速提取字节

时间:2017-01-15 11:27:00

标签: ios swift3

数据以struct Data大小count == 5的形式到达,最后3个字节包含需要提取的ID。

以下代码有效,但我相信它可以大大改进(因为你可以说我是swift的新手!):

var data:[UInt8] = [ 0xff, 0xff, 0x01, 0x02 ,0x03 ]
var txData = Data(bytes: data)
print(txData.count)
let byte00 = txData.subdata(in: 2..<3 ).withUnsafeBytes { (ptr: UnsafePointer<UInt8>) -> UInt8 in
    return ptr.pointee
}
let byte01 = txData.subdata(in: 3..<4 ).withUnsafeBytes { (ptr: UnsafePointer<UInt8>) -> UInt8 in
    return ptr.pointee
}
let byte02 = txData.subdata(in: 4..<5 ).withUnsafeBytes { (ptr: UnsafePointer<UInt8>) -> UInt8 in
    return ptr.pointee
}

let rxData = (UInt(byte00) << 16) + (UInt(byte01) << 8) + UInt(byte02)
print( String(rxData, radix:16) )

任何有关swift领域的教程建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

你可以这样写:

var data:[UInt8] = [ 0xff, 0xff, 0x01, 0x02 ,0x03 ]
var txData = Data(bytes: data)
print(txData.count)
let byte00 = txData[2]
let byte01 = txData[3]
let byte02 = txData[4]

let rxData = (UInt(byte00) << 16) + (UInt(byte01) << 8) + UInt(byte02)
print( String(rxData, radix:16) ) //->10203

在Swift 3中,Data可被视为UInt8的集合,当您将每个字节设为Data时,您可以直接下标到UInt8

由于3字节对于当前CPU来说不是一个好的数字,因此上面的代码不能短得多。