我有一个长度为256的缓冲区,用于接收来自蓝牙的字节序列。我需要提取的实际数据包以字节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");
}