[英]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個字節的數組。 我已經嘗試了很多,找不到解決方案。 提前致謝
最簡單的解決方案是使用MoreLINQ的Split擴展方法:
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.