pohcb_sonic Ответов: 2

C#: как считывать данные из массива данных в циклах по 8?


У меня есть байтовый массив данных 128, что означает от байта 0 до 127. Однако мне нужно закодировать его таким образом, чтобы он каждый раз считывал только 16 различных данных из массива, что означает в общей сложности 8 циклов. Как мне это сделать?

Что я уже пробовал:

byte [] dat = new byte[128];
string display;
int loop = dat.length() / 16;

for(int i = 0; i < 16; i++)
{
   //display it
   display = dat[i].toString();
}

2 Ответов

Рейтинг:
12

Richard MacCutchan

Вам нужен внешний цикл или счетчик, который заставляет внутренний цикл повторяться. Что-то вроде:

byte [] dat = new byte[128];
string display;

for (int offset = 0; offset < dat.Length; offset += 16)
{
    for(int i = 0; i < 16; i++)
    {
       //display it
       display = dat[i + offset].ToString();
    }
    //
    // add extra code here at the end of each set of 16
    //
}


George Swan

Хороший ответ 5ed

Richard MacCutchan

Спасибо. Я просто скопировал код ОП и забыл проверить его на столе.

Рейтинг:
0

George Swan

Ответ Ричарда лучше всего подходит для ваших нужд. Возможно, в памяти будет проще использовать перечислимое число, если у вас есть много данных для обработки. В этом примере используется Linq сгруппировать данные в наборы, каждый из которых содержит 16 значений. Он использует IEnumerable<int> поскольку его легко инициализировать. Я не предлагаю вам использовать его, но он может быть полезен в других подобных приложениях


static void Main(string[] args)
  {
       var x = Enumerable.Range(0, 128);
      int s = -1;
      var sets = x.Select((v, i) =>
      (Set: (i % 16 == 0) ? ++s : s, Value: v))
      .GroupBy(a => (a.Set), (key, values) => (key, values));

      foreach (var (key, values) in sets)
      {
          Console.WriteLine(key);
          string spacer = string.Empty;
          foreach (var (Set, Value) in values)
          {
              Console.Write($"{spacer}{Value}");
              spacer = spacer == string.Empty ? ", " : spacer;
          }
          Console.WriteLine();
      }

      Console.ReadLine();
  }


pohcb_sonic

могу я спросить, что такое "я" и "в"?

George Swan

'я' является значением индекса и 'V' имеет значение. Таким образом, для перечисляемого 1,5,10, если i=1, v равно 5
Метод Select приводит к перечислению кортежей значений (int Set, int Value). Переменная set увеличивается каждый раз, когда i mod 16 равен 0. Группа состоит из ключа и перечислимого числа значений, принадлежащих этому ключу. Метод GroupBy группирует использование переменной Set в качестве ключа в перечислимые кортежи значений, каждый из которых состоит из ключа и перечислимых значений, имеющих этот ключ.Первый цикл foreach выводит ключ, а второй цикл выводит значения, связанные с этим ключом.