我有一个长度为 256 的缓冲区,它从蓝牙接收字节序列。我需要提取的实际数据包以 byte开头和结尾126
。我想使用 LINQ 提取缓冲区中的最新数据包。
我现在正在做的是检查最后一个索引,126
然后倒数直到我到达另一个126
。也有一些陷阱,例如,两个相邻的数据包可能会导致两个字节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");
}