如何在c#中按特定数组值拆分字节数组?

时间:2017-06-21 09:21:25

标签: c# asp.net arrays

如何在c#中按特定数组值拆分字节数组?

    byte[] largeBytes = [70,68,49,59,117,49,59,112]; 

我只想将数组拆分为“59”,这样我就可以得到3个字节的数组。 我已经尝试了很多,找不到解决方案。提前谢谢

4 个答案:

答案 0 :(得分:1)

最简单的解决方案是使用Split中的MoreLINQ扩展方法:

byte separator=59;
var triplets=largeBytes.Split(separator);

这将返回IEnumerable IEnumerable<byte>。您可以使用IEnumerable<byte[]>将其转换为ToArray()

var triplets=largeBytes.Split(separator).Select(triplet=>triplet.ToArray());

或者你可以粗略地做扩展方法的工作 - 创建一个迭代器来检查每个输入元素,直到它找到分隔符并将每个字符放在一个数组中:

public static IEnumerable<List<T>> Split<T>(this IEnumerable<T> source, T separator)
{
    List<T> result=new List<T>(3);
    foreach(T item in source)
    {
        if (item == separator)
        {
            yield return result;
            result=new List<T>(3);
        }
        else 
        {
            result.Add(item);
        }
    }
    yield return result;
}

您可以以相同的方式使用此扩展方法:

byte separator=59;
var triplets=largeBytes.Split(separator);

var triplets=MyExtensionsClass.Split(largeBytes,separator);

MoreLINQ的版本功能更多,因为它允许您指定最大分割数,或将输入转换为另一种形式

如果您想包含分隔符,请将result.Add放在第一个if之前。更好的选择是添加include参数:

public static IEnumerable<List<T>> Split<T>(this IEnumerable<T> source, T separator,bool include=false)
{
    List<T> result=new List<T>(3);
    foreach(T item in source)
    {
        if (item == separator)
        {
            if (include) result.Add(item);
            yield return result;
            result=new List<T>(3);
        }
        else 
        {
            result.Add(item);
        }
    }
    yield return result;
}

答案 1 :(得分:0)

你可以在循环中使用Array.IndexOf(largeBytes, (byte)59, index)索引最后找到索引(开头为0),直到函数返回-1(在数组中找不到59)。 在由(byte)59创建的边界上,复制一些子数组,如以下答案所示:Getting a sub-array from an existing array

答案 2 :(得分:0)

这是关于如何实现这个的算法

 //Here I'm not including 59 in the sub arrays  
       var largeBytes = new byte[] {70,68,49,59,117,49,59,112};
        var lists = new List<List<byte>>();
        const int marker = 59;
        var tempLst = new List<byte>();
        foreach (var largeByte in largeBytes)
        {


            if (largeByte==marker)
            {
                lists.Add(tempLst);               
                tempLst=new List<byte>();
            }
            else
            {
                tempLst.Add(largeByte);    
            }

        }
        lists.Add(tempLst);

答案 3 :(得分:0)

您可以使用IEnumerable&#39; GroupBy来执行拆分:

byte[] largeBytes = new byte[] {70,68,49,59,117,49,59,112};
byte split = 59;
long index = 0;
var results = largeBytes.GroupBy(b => index += Convert.ToInt64(b==split)); 
foreach (var result in results) {
    Console.WriteLine($"Group Key: {result.Key}");
    foreach (var value in result) {
        Console.WriteLine($" - Value: {value}");
    }
}

只是为了好玩,以下是使用C#7元组的方法:

byte[] largeBytes = new byte[] {70,68,49,59,117,49,59,112};
byte split = 59;
long index = 0;
var results = largeBytes.Select(x => ((index += Convert.ToInt64(x == 59)),x));
foreach (var tuple in results) { 
    Console.WriteLine($"{tuple.Item1}: {tuple.Item2}");
}

演示:http://csharppad.com/gist/079cc46095bb938f716587693d7ea8af