2017-01-15 3 views
0

データはstruct Dataの形式で到着します。サイズcount == 5最後の3バイトには抽出する必要があるIDが含まれています。 (あなたは私が迅速に新しいです言うことができるように!)すぐにstructデータからバイトを抽出する

次のコードは動作しますが、しかし、私はそれを大幅に向上させることができたと確信しています:

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のこの領域をカバーする任意のチュートリアルの勧告をいただければ幸いです。あなたはこのような何か書くことができます

+0

[危険スウィフト:ポインタを使用してCとの対話](https://www.raywenderlich.com/148569/unsafe-swift?utm_source=raywenderlich.com+Weekly&utm_campaign=0863916fc0-raywenderlich_com_Weekly11_29_2016&utm_medium=email&utm_term=0_83b6edc87f-0863916fc0-414818977 ) –

答えて

2

:スウィフト3では

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 

を、DataUInt8のコレクションとして扱うことができUInt8として各バイトを取得するとき、あなたは直接Dataに添字ことができます。

3バイトは現在のCPUにとって適切ではないため、上記のコードはそれほど短くできません。

関連する問題