我有以下字节数组。
byte[] subArray = { 0x00, 0x01, 0x00, 0x01 };
byte[] array = { 0x1A, 0x65, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x2B, 0x4C, 0xAA };
我想识别子阵列并将前面的字节加载到另一个字节数组中,即结果应如下所示。
byte[] result = {0x2B, 0x4C, 0xAA }
我想在子阵列之后加载所有内容。
任何帮助将不胜感激。
感谢。
答案 0 :(得分:2)
改编自我的other answer:
byte[] subArray = { 0x00, 0x01, 0x00, 0x01 };
byte[] array = { 0x1A, 0x65, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x2B, 0x4C, 0xAA };
var matchIndexes =
from index in Enumerable.Range(0, array.Length - subArray.Length + 1)
where array.Skip(index).Take(subArray.Length).SequenceEqual(subArray)
select (int?)index;
var matchIndex = matchIndexes.FirstOrDefault();
if (matchIndex != null)
{
byte[] successor = array.Skip(matchIndex.Value + subArray.Length).ToArray();
// handle successor here
}
答案 1 :(得分:0)
此问题描述了如何获取父数组中子数组的第一个索引。可以通过添加计数轻松修改以获取子数组的最后一个索引。从那里你可以使用LINQ Take和Skip或类似的数组操作函数。
Find the first occurrence/starting index of the sub-array in C#
答案 2 :(得分:0)
一种方法是执行以下操作
start from the first position
compare corresponding elements of array and sub array
if there is a match
return the indexes as necessary and use the indexes to extract the result sets.
else
advance by 1 position
repeat until you exhaust the whole main array
您可以使用此方法在主数组中提取多个子数组。
这是第一次削减。可能还有其他更有效的实现。
答案 3 :(得分:0)
试试这个。我没有测试这段代码,可能会有一些语法错误,即使不起作用,也要尝试理解算法。
byte[] subArray = { 0x00, 0x01, 0x00, 0x01 };
byte[] array = { 0x1A, 0x65, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x2B, 0x4C, 0xAA };
byte[] result;
int lastLocation = -1;
bool control = false;
foreach(byte x in subArray)
{
if(array.contains(x))
{
if(location!=-1 || array.IndexOf(x) == lastLocation+1)
{
control = true;
lastLocation = array.IndexOf(x);
}
else
{
control = false;
lastLocation = -1;
}
}
else
{
control = false;
lastLocation = -1;
}
}
if(control)
{
Array.Copy(array,lastLocation,result,0);
}