Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 25 • Страница 1 из 21  2  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Не могу понять, как считать файл в двоичном режиме со всеми спец символами (перевод каретки, возврат строки ...). Пытаюсь использовать для этого fread(*buf, nsize, n), но в buf оказывается какая-то фигня. Читаю от начала файла до (!feof). Подскажите, как реализовать? И вообще я не до конца понимаю нужно кодировать двоичные цепочки или шестнадцатиричные? Почему-то мне кажется что шеснадцетеричные.

Как я понял в RLE алгоритме последовательно идущие одинаковые байты заменяются на связку префикс + количество + повторяющейся байт. Что такое префикс?



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
spmn писал(а):
Как я понял в RLE алгоритме последовательно идущие одинаковые байты заменяются на связку префикс + количество + повторяющейся байт. Что такое префикс

Если мне не изменяет память (ой как давно я с этим работал) то пакуется это примерно так.
АББББССДЕЕФ***
берется управляющий символ, скажем звездочка *
при упаковка имеем
А*4Б*2СД*2ЕФ*3**
если встречается такой же символ как выбранный нами управляющий символ , то он просто повторяется дважды.


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Ray Adams
Ray Adams писал(а):
если встречается такой же символ как выбранный нами управляющий символ , то он просто повторяется дважды.

То есть, при распакове последнюю последовательность ** надо просто выбросить?
Ray Adams писал(а):
А*4Б*2СД*2ЕФ*3**

Следовательно кодирование повторяющихся цепочек длинной <= 3 нецелесообразно?

А остальные вопросы?


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
spmn писал(а):
цепочек длинной <= 3 нецелесообразно?


Да, потому этот алгоритм чаще всего применяет в графике так как там часто идут повторяющиеся цвета.
spmn писал(а):
То есть, при распакове последнюю последовательность ** надо просто выбросить?

Нет ты не понял. Вот начинаеш ты разбирать уже упакованный текст.
Читаеш первый символ - управляющий?
Да - читаем следующий, опять управляющий? Значить это просто был символ иначе получили кол-во повторений и сразу читаем следующий символ - он и есть наше повторение.
Я немного ошибся тами с упаковкой должно быть так
А*4Б*2СД*2ЕФ*3* - тоесть управляющий символ если он повторяется то просто записывается после его кол-во повторений , но если исходник был таким
АББББССДЕЕФ*, то в реузльтате мы получим вот это
А*4Б*2СД*2ЕФ**


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Ray Adams
С кодированием теперь все понятно. А с остальными моими вопросами как быть?


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
С какими? С чтением из файла? Ну так тут уж прочти документацию, особенно то место где описывается работа с файлами :) Чтобы работать не как с текстовым файлом, надо открывать так
fopen(szFilename,"wb")) - это на запись b означает , что файл будет бинарным.


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Нет, с fread() я разобрался, а вот например:
я объявляю переменную char buf[1], потом считываю в нее
fread(buf,sizeof(buf), 1, file). То есть считываю один символ. Файл открыт как "rb". Например из текстового файла букву "П", а к ней прилипает последовательность \bZ2XD‰ , то есть buf = "П\bZ2XD‰". Что это?

И еще. Я думаю что те же буквы представляются набором восьми бит. Например: a - 00110011, то есть сжимать мне надо именно битовые последовательности или сами буквы? Если битовые, то как их получить ???


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
spmn эта "последовательность" - обычный мусор. Дело в том, что объявления char [] отладчик тракутует как строки, и пытается показывать их до терменирующего нуля. Правильнее было объявить char buf;
Битовые последовательности получить можно с помощью маски. например (buf >> n) & 0x1 ты получишь бит номер n. n естественно от 0 (младший бит) до 7 (старший)

Но побитовое RLE сжатие скорее всего не оправдано. Сжимай побайтно.

_________________
Цель жизни - d20 по жизни...


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
spmn писал(а):
Например: a - 00110011, то есть сжимать мне надо именно битовые последовательности или сами буквы? Если битовые, то как их получить ?

RLE не для битовый последовательностей. Для этого есть куча других алгоритмов. Да и если тебе надо что-то сжимать почему бы не взять уже готовые библиотеки?


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Ray Adams писал(а):
не взять уже готовые библиотеки?


Интересно самому попробовать :)

Цитата:
(buf >> n) & 0x1

Не работает маска :oops


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
spmn писал(а):
Не работает маска :oops

Что значит не работает? Ты как ее проверяеш то? Это же простейшая двоичная арифметика.
if ((buf & (1 << 1))==1) {
бит 2 равен 1
}
if ((buf & (1 << 2))==1) {
бит 3 равен 1
}

Добавлено спустя 1 минуту, 31 секунду:
Также как и
(buf >> n) & 0x1
вместо n пишеш какой бит проверить
if ((buf >> 1) & 0x1) {
бит 2 равен 1
}


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Ray Adams

Пишет: Illegal use of pointer.

Ведь в данном случае buf char [1]. Если просто объявить char buf, то не работает fopen();


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
spmn писал(а):
Пишет: Illegal use of pointer.

Это где пишет???


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Ray Adams писал(а):
Это где пишет???


Компилятор выдает ошибку. Компилятор Borland C++ Bilder 5.0


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
spmn писал(а):
Компилятор выдает ошибку. Компилятор Borland C++ Bilder 5.0

Я про код говорил, дай кусок своего кода где компилятор ругается


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Ray Adams писал(а):
(buf >> n) & 0x1


В этом участке и ругается.

Еще вопросик.
Я пытаюсь записать в файл число повторений. Пишу так:
short *i;
i = new short; // i - счетчик повторений.
i++;
fwrite(&i, sizeof(short), 1, out). А в файл попадает какая то фигня вместо цифр. Как с этим бороться? Может я что не правельно указываю ???


 

Member
Статус: Не в сети
Регистрация: 06.11.2003
spmn вместо i++ надо (*i)++
а вместо fwrite(&i, sizeof(short), 1, out) надо fwrite(i, sizeof(short), 1, out)
потому что i у тебя указатель


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
spmn Может все таки сядеш наконец за документацию по C++? :)


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Ray Adams
Ray Adams писал(а):
Может все таки сядеш наконец за документацию по C++?

Я бы сел, мне не влом ... только нет у меня ее. Ни одной книги по с++ нет :(
А в help'e borlanda описание ф-ии fwrite() не совсем понятное. Вернее оно понятное, только не для моего случая. Там написанно, что туда надо передать указатель, в примере используется структура.

На форуме ixbt я видел, что записывали массив double и выглядело это так:
Код:
fwrite(&array[i], sizeof(double), 1, ou)

По всей видимости этот массив объявлен как не динамический.
У меня также объявлен счетчик повторений сиволов:
Код:
short int i = 1;
...
fwrite(&i, sizeof(short int), 1, ou);
...

В итоге в файл вместо цифры попадает что-то отдаленно напоминающее мягкий знак.
Пробовал по-другому:
Код:
short int *i;
i = new short int;
*i=1;
...
fwrite(i, sizeof(short int), 1, ou)
...

Результат тот же.
Был еще вариант:
Код:
short int *i;
i = new short int;
*i=1;
...
fwrite(&i, sizeof(short int), 1, ou)
...

Тогда в файл попадает какой-то символ, напоминающий букву А.

Может кто подскажет как мне оргонизовать ввод числа в файл средствами fwrite() ??? :oops:


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
мдя.... Ладно давай по порядку. Если ты пишешь число как short int, long и т.д. то туда пишется не понятное человеческому глазу число, а то, как оно есть. Причем старший и младший байт поменяны местами (т.н. Little Endian).
Отсюда вывод.
short int i =1;
fwrite(&i, sizeof(short int),1,ou) работает нормально записав в файл шестнадцатиричную последовательность 0100.
Если ты хочешь увидеть число 1, то пиши так
fprintf(ou,"%i",i).
По поводу документации. А что, поисковые машины на слова "C++ руководство программиста" возвращают пусто?

_________________
Цель жизни - d20 по жизни...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 25 • Страница 1 из 21  2  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan