20.12.2014 / 13:54 | |
ДубоХирург Пользователь Сейчас: Offline
Имя: Сергей Откуда: Где-то возле Москвы Регистрация: 01.07.2012
| Kalter, симулятор
Изменено ДубоХирург (20.12 / 13:55) (всего 1 раз) |
23.12.2014 / 19:23 | |
RblSb Пользователь Сейчас: Offline
Регистрация: 25.07.2011
| У кого нибудь есть реализация RLE-сжатия? И насчет этой статьи, я не понял, на выходе после расшифровки/шифровки получается измененный поток? |
23.12.2014 / 19:35 | |
vl@volk Пользователь Сейчас: Offline
Имя: Владислав Откуда: Земля Регистрация: 26.12.2012
| RblSb, Поищи в файлах темы, я там разные варианты делал
__________________
знает толк |
23.12.2014 / 20:03 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| RblSb, да, на выходе изменённый.
__________________
let live |
25.12.2014 / 02:31 | |
RblSb Пользователь Сейчас: Offline
Регистрация: 25.07.2011
| aNNiMON, rle туда видимо не прилепить, придется грузить все в массив байт
|
25.12.2014 / 09:05 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| RblSb, если я правильно понимаю о чем ты, то прикрутить очень просто. При записи записываешь байт, и запоминаешь его, если потом приходит такой же, то увеличиваешь счетчик, если другой, то пишешь счетчик и этот новый. В flush просто птшешь счетчик. При чтении по аналогии.
Изменено Naik (25.12 / 09:08) (всего 1 раз) |
25.12.2014 / 09:56 | |
RblSb Пользователь Сейчас: Offline
Регистрация: 25.07.2011
| Насчет алгоритма понятно, но как прочитать байт в inputstream и чтобы там благодаря собственному потоку оказалось два байта - не понял. Примеры в статье только для шифрования туда-обратно и годятся. Зачем нужен flush()?
|
25.12.2014 / 10:05 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| RblSb, посмотри библиотеку net.sf.zipme, там ZipInputStream, ZipOutputStream и для Gzip тоже. Так что можно и для сжатия делать. В GzipInputStream есть только метод read(byte[] buf, int offset, int length), его за глаза хватит, readByte не нужен по сути.
__________________
let live Изменено aNNiMON (25.12 / 10:11) (всего 1 раз) |
25.12.2014 / 10:06 | |
vl@volk Пользователь Сейчас: Offline
Имя: Владислав Откуда: Земля Регистрация: 26.12.2012
| flush() дописывает оставвшиеся байты из буфера в файл
__________________
знает толк |
25.12.2014 / 12:03 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Цитата RblSb: Насчет алгоритма понятно, но как прочитать байт в inputstream и чтобы там благодаря собственному потоку оказалось два байта - не понял. Примеры в статье только для шифрования туда-обратно и годятся. ЗКак-то так (не проверял) Открыть спойлер Закрыть спойлер package ua.naiksoftware.io;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* http://uk.wikipedia.org/wiki/RLE
* @author Naik
*/
public class RleOutputStream extends OutputStream {
private long count;
private int current;
private final DataOutputStream out;
public RleOutputStream(OutputStream out) {
this.out = new DataOutputStream(out);
count = 0;
}
@Override
public void write(int b) throws IOException {
if (b == current) {
count++;
} else {
if (count != 0) {
out.write(current);
out.writeLong(count);
}
current = b;
count = 1;
}
}
@Override
public void flush() throws IOException {
if (count != 0) {
out.write(current);
out.writeLong(count);
}
out.flush();
super.flush();// не знаю, нужен вызов метода суперкласса или нет..
}
}
Открыть спойлер Закрыть спойлер package ua.naiksoftware.io;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* http://uk.wikipedia.org/wiki/RLE
* @author Naik
*/
public class RleInputStream extends InputStream {
private long count;
private int current;
private final DataInputStream input;
public RleInputStream(InputStream input) {
this.input = new DataInputStream(input);
}
@Override
public int read() throws IOException {
if (count < 1) {
current = input.read();
count = input.readLong();
}
count--;
return current;
}
}
|