簡體   English   中英

如何用C#中的特定數組值拆分字節數組?

[英]How to split a byte array by a particular array value in c#?

如何用C#中的特定數組值拆分字節數組?

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

我只想將數組再分成“ 59”,以便獲得3個字節的數組。 我已經嘗試了很多,找不到解決方案。 提前致謝

最簡單的解決方案是使用MoreLINQSplit擴展方法:

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

這將返回IEnumerable<byte>IEnumerable<byte> 您可以使用ToArray()將其轉換為IEnumerable<byte[]>

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;
}

您可以使用Array.IndexOf(largeBytes, (byte)59, index) ,其中index將是循環中最后找到的索引(開頭為0),直到函數返回-1 (在數組中找不到59 )。 (byte)59創建的邊界上,按照此答案中的說明復制一些子數組: 從現有數組獲取子數組

這是關於如何實現這一目標的算法

 //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);

您可以使用IEnumerable的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM