Я работаю над проектом кодирования 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)