Bluetooth からバイト シーケンスを受信する長さ 256 のバッファーがあります。抽出する必要がある実際のパケットは、 byteで始まり、 byteで終わります126
。LINQ を使用して、バッファー内の最新のパケットを抽出したいと考えています。
私が今行っているのは、 の最後のインデックスをチェックしてから126
、別の に到達するまで逆方向にカウントすること126
です。いくつかの落とし穴もあります。たとえば、2 つの隣接するパケットが 2 バイト隣り合っ126
ている可能性があります。
バッファのサンプルは次のとおりです。
126 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126 126 69 0 0
だから私が持っている情報は次のとおりです。
- パケットはバイト値 126 で開始および終了します
- 開始インデックスの後の次のバイトの値は 69 です
- 126 の最後のバイトの直前の最後の 3 バイトは、計算方法を知っているパケット全体の CRC であるため、パケットを抽出した後、この CRC をチェックして、正しいパケットがあるかどうかを確認できます。
最後に、正しいパケットを含む配列またはリストが必要です。例えば:
126 69 0 0 1 0 2 2 34 6 0 5 232 125 93 126
このパケットをバッファから抽出する簡単な解決方法を教えてください。
これは私がこれまでに試したことです....探している正しいパケットを実際に返すことができないため、失敗します:
var data = ((byte[])msg.Obj).ToList(); //data is the buffer
byte del = 126; //delimeter or start/end byte
var lastIndex = data.LastIndexOf(del);
var startIndex = 0;
List<byte> tos = new List<byte>(); //a new list to store the result (packet)
//try to figure out start index
if(data[lastIndex - 1] != del)
{
for(int i = lastIndex; i > 0; i--)
{
if(data[i] == del)
{
startIndex = i;
}
}
//add the result in another list
for(int i = 0; i <= lastIndex - startIndex; i++)
{
tos.Add(data[i]);
}
string shit = string.Empty;
foreach (var b in tos)
shit += (int)b + ", ";
//print result in a textbox
AddTextToLogTextView(shit + "\r\n");
}