вычисление чисел в массиве (декодирование длины выполнения)

#c# #arrays #decoding #run-length-encoding

#c# #массивы #декодирование #кодирование длины выполнения

Вопрос:

         int[] bytes = new int[9] { 123, 5, 65, 123, 6, 77, 123, 4, 101 };       
        int count = 1;          
        for (int i = 1; i < bytes.Length; i  )
        {
            
            if (bytes[i] == 123)
            {
                count  ;              
            }
            else
            {
                Console.WriteLine(bytes[i]);
            }
        }
        Console.ReadLine();
 

Я новичок в программировании.
123 — это какой-то тип «маркера».
Я не знаю, как сделать вывод на консоль, подобный этому: 65 65 65 65 65 77 77 77 77 77 77 101 101 101 101
Я был бы признателен за любую помощь

Комментарии:

1. «Я не знаю, как сделать вывод на консоль, подобный этому: 65 65 65 65 65 77 77 77 77 77 77 101 101 101 101» Честно говоря, я тоже. Это какой -то тип кодирования длины выполнения? В любом случае, в чем именно заключается ваша проблема? Что работает, а что нет? Каков результат, который вы на самом деле получаете от приведенного выше кода?

2. Если это кодирование длины выполнения, вам, конечно, нужно сначала получить количество раз, которое вы хотите повторить, а затем затем повторить байт? Это разные элементы, поэтому первая итерация даст вам столько, сколько вы хотите, а затем вторая даст вам байт для повторения. Затем вам понадобится цикл, чтобы повторить этот байт такое количество раз.

Ответ №1:

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

  • 123 означает «следующие два байта X и Y должны интерпретироваться как X экземпляров (0-255) полезной нагрузки Y».

итак, вы бы проанализировали один байт, если он не равен 123: сдайтесь, потому что у вас нет других правил, которым нужно следовать, но в противном случае прочитайте X и Y и выведите X копий значения Y

В псевдокоде:

 while(TryTakeByte(out val)))
    switch val
        123:
            if (!TryTakeByte(out x) || !TryTakeByte(out y)) FailEndOfStream()
            for (i from 0 to x)
                write y
        default:
            FailNoClueWhatToDo() // refer to protocol specification
 

Комментарии:

1. «В данном случае я мог бы предположить следующее: » Должны ли мы действительно это сделать?

2. @HimBromBeere до тех пор, пока мы заявляем, что это спекуляция, и отмечаем, что мы действительно должны проверять то, что указано в спецификации: конечно

3. «если это не 123: сдавайтесь, потому что у вас нет других правил, которым нужно следовать» — Ну, стандарт для RLE на основе флагов заключается в том, что все, что встречается, что не соответствует шаблону флага, может считаться несжатым и должно быть просто скопировано. Я имею в виду, что в противном случае нет смысла даже иметь 123 байта; если все ожидаемые данные представляют собой пары длина-значение, вам не понадобятся никакие маркеры.