Вынести группы байтов в отдельный List (C#)
Всех приветствую! Имеется List, наполненный типом byte. В нем периодически встречается байт 0x01. Задача: необходимо из этого List перенести в новый List все байты, разбив их на группы. Новый List будет содержать элементы byte[]. Каждая группа будет начинаться после очередного 0x01. Например, в ({ 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04 }) должно быть 3 группы: 0x02, 0x03; 0x02, 0x03, 0x00; 0x02, 0x02, 0x04.
using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System;
using System.Net;
//using WCSUniService.Devices;
//using FastReport.Utils;
using System.Collections;
using System.Security.Cryptography.X509Certificates;
namespace WCSUniService.Models
{
public class Test
{
static void SortTelegrams(byte id, byte[] bytes)
{
List<byte> items = new List<byte>();
items.AddRange(bytes);
List<byte[]> telegrams = new List<byte[]>();
//int index = telegrams.Fi((item) => item == id);
// { 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04 };
byte[] telegramArr = new byte[4];
for (int i = 0; i < items.Count;)
{
if (items[i] == id)
{
++i;
int j = 0;
while (items[i] != id)
{
telegramArr[j] = items[i];
++j;
if (items[i] != id)
++i;
}
telegrams.Add(telegramArr);
}
}
for (int i = 0; i < telegrams.Count; i++)
{
Console.WriteLine(telegrams[i]);
}
//foreach (byte telegram in telegrams)
//{
// if (telegram == id)
// {
// Console.WriteLine();
// Console.Write(telegram + "\t");
// }
// else
// Console.Write(telegram + "\t");
//}
}
public static void Main(string[] args)
{
byte[] bytes = new byte[] { 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04 };
//LingerOption
SortTelegrams(1, bytes);
}
}
}
Ответы (2 шт):
@aepot Предлагаю упростить
List<byte> list = new List<byte>();
foreach (byte item in bytes)
{
if (item != 1)
{
list.Add(item);
}
else if (list.Count > 0)
{
lists.Add(list);
list = new List<byte>();
}
}
if (list.Count > 0)
{
lists.Add(list);
}
Предлагаю посмотреть на библиотеку MoreLINQ.
С её помощью решение получается лаконичным.
using MoreLinq;
byte[] bytes = new byte[] {
0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04 };
IEnumerable<IEnumerable<byte>> result1 = bytes
.Split((byte)0x01)
.Where(x => x.Any());
foreach (var items in result1)
Console.WriteLine(string.Join(", ", items));
Обратите внимание: в результате будет получен тип IEnumerable<IEnumerable<byte>>.
Если нужен именно List<byte[]>, то слегка изменяем код:
List<byte[]> result2 = bytes
.Split((byte)0x01, items => items.ToArray())
.Where(x => x.Length > 0)
.ToList();
Конечно, не стоит тащить в свой проект дополнительную библиотеку ради одного метода. Но полезных методов в ней много и она вполне может пригодиться для решения других задач.