Hallo,
ich möchte mir einen Stream "basteln" der zuvor Kompremierte Bytes wieder dekomprimiert. Das Komprieren soll nach dem "run length encoding" stattfinden.
Beispiel:
Aus {-1, 5, 5, 5} wird { -1, -1, -1, 5, 3 }. Eine -1 wird zu 2 aufeinander folgende -1, der Anfang einer Bitfolge (eine Art Sequenz) wird auch mit einer -1 dargestellt. Als nächstes käme das Bit an sich und als 3. die Anzahl der Bits.
Nun zum eigentlichem Problem. Ich überschreibe die read() Methode des Input Streams wie folgt:
Wenn ich mir Testweise eine Testklasse schreibe, bricht diese innerhalb der Schleife ab da -1 zurückgeben wird. Mir wurde aber erzählt, dass der Compiler selber erkennt ob ein Byte oder Integer Wert zurückgeben wird, daher müsste das ganz doch so klappen?
Testklasse:
ich möchte mir einen Stream "basteln" der zuvor Kompremierte Bytes wieder dekomprimiert. Das Komprieren soll nach dem "run length encoding" stattfinden.
Beispiel:
Aus {-1, 5, 5, 5} wird { -1, -1, -1, 5, 3 }. Eine -1 wird zu 2 aufeinander folgende -1, der Anfang einer Bitfolge (eine Art Sequenz) wird auch mit einer -1 dargestellt. Als nächstes käme das Bit an sich und als 3. die Anzahl der Bits.
Nun zum eigentlichem Problem. Ich überschreibe die read() Methode des Input Streams wie folgt:
Java:
public class DecompressingInputStream extends InputStream {
final byte SPECIAL_BYTE = -1;
final int SEQUENCE_LENGTH = 3;
private int countNumber = 0;
private final InputStream in;
private byte returnNumber;
public DecompressingInputStream(InputStream in) {
this.in = in;
}
@Override
public int read() throws IOException {
if (countNumber > 0) {
countNumber--;
return returnNumber;
}
int nextInt = (int) in.read();
if (nextInt == -1) {
return -1;
}
byte nextByte = (byte) nextInt;
if (nextByte == SPECIAL_BYTE) {
nextInt = (int) in.read();
nextByte = (byte) nextInt;
if (nextByte == SPECIAL_BYTE) {
return nextByte;
} else {
nextInt = in.read();
if (nextInt == -1) {
return -1;
}
returnNumber = nextByte;
countNumber = nextInt - 1;
}
}
return nextByte;
}
Wenn ich mir Testweise eine Testklasse schreibe, bricht diese innerhalb der Schleife ab da -1 zurückgeben wird. Mir wurde aber erzählt, dass der Compiler selber erkennt ob ein Byte oder Integer Wert zurückgeben wird, daher müsste das ganz doch so klappen?
Testklasse:
Java:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class main {
public static void main(String[] args) throws IOException {
byte[] input = { 0, 1, 1, 1, 1, 1, 1 };
byte[] output = { -1, -1, -1, 5, 3 };
byte[] decomp;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CompressingOutputStream cos = new CompressingOutputStream(bos);
ByteArrayInputStream bis = new ByteArrayInputStream(output);
DecompressingInputStream is = new DecompressingInputStream(bis);
cos.write(input);
cos.close();
int daten;
byte b;
while ((daten = is.read()) != -1) {
b = (byte) daten;
System.out.print(daten + " ");
}
is.close();
}
public static void arrayGedöns(byte[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
}