Как бы я неоднократно добавлял байтовое значение к байтовому массиву x раз, основываясь на значении в индексе до него? - PullRequest
0 голосов
/ 19 октября 2019

Я работаю над проектом кодирования RLE на Java, и у меня есть 8 методов для завершения. Один из них включает в себя использование байтового массива, представляющего сжатый байтовый массив RLE (например: {3, 15, 6, 4}), и распаковку его до его первоначальных значений ({15, 15, 15, 4, 4, 4, 4,4, 4}). Как бы я зациклил решение на том, где оно добавляет второе значение в сжатый массив x раз (например, добавляя значение 15 три раза к новому байтовому массиву или значение 4 шесть раз к новому массиву).

Я попытался создать два цикла for, которые являются вложенными, и мне интересно, смогу ли я преобразовать значение байта при каждом нечетном индексе в целое число и иметь каждое четное число в этом случае, многократно добавляя к байтовому массиву это числораз, основанный на int нечетного индекса перед ним. Я не знаю, как бы мне пришлось реализовать этот метод, хотя. Я уже создал метод, который кодирует байтовый массив RLE (сжатие {15, 15, 15, 4, 4, 4, 4, 4, 4} туда, где он возвращает {3, 15, 6, 4}). И, по сути, я должен сделать обратное и вернуть его к прежнему байтовому массиву.

Метод кодирования данных RLE


        int countRunResult = countRuns(flatData);
        ByteArrayOutputStream returnedEncoded = new ByteArrayOutputStream();
        for(int i = 0; i < flatData.length; i++){
            int runLength = 1;
            while(i+1 < flatData.length && flatData[i] == flatData[i+1]){
                runLength++;
                i++;
            }
            returnedEncoded.write((byte)runLength);
            returnedEncoded.write((byte)flatData[i]);
        }
        return returnedEncoded.toByteArray();
    }

Что у меня есть для декодирования данных RLE

        int initialLength = getDecodedLength(rleData);
        byte[] returnDecoded = new byte[initialLength];
           for(int i = 0; i < initialLength; i++){
                for(int j = 1; j < initialLength; j+=2){

                    returnDecoded[i] = rleData[j];
                }

            }

        return returnDecoded;   
    }

Я ожидал {15, 15, 15, 4, 4, 4, 4, 4, 4} в этом примере, но я получил сообщение об ошибке «за пределами»:

Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: Index> 5за пределами длины 4 в RleProgram.decodeRle (RleProgram.java:61) в RleProgram.main (RleProgram.java:99)

...