Duke
Гость
|
|
« : 07-03-2005 19:26 » |
|
Например, есть некоторая совокупность символов, каждый из которых кодируется двоичным числом с длиной кода не кратной длине байта - от 1 до 10 бит, т.е. а1=1, а2=101 и т.п. Вопрос: как записывать и считывать подобные коды из файла? И как вообще работать с такими кодами в самой программе? Ответ, пожалуйста, дайте на Delphi или асемблере, т.к. прога на Delphi и переделать её невозможно.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 07-03-2005 19:42 » |
|
Duke, У тебя отводится на каждую комбинацию бит строгое количество знаков или длина битового слова может меняться? т.е. ты должен записывать только по 10 бит, или ты первые нули выбрасываеш?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #2 : 07-03-2005 20:00 » |
|
есть такое понятие как бинарные операции. Shift Left, Shift right и т.д.
Структура файла из описания не ясна. Линейный файл где 00101000101001001 - запись и заранее неизвестно сколько какой код занимает место не читабелен в принципе - должна быть либо заранее известна постоянная длина, скажем 10 бит - максимальная. Тогда можно записывать код 0000000101 и 0101101101 без разделения.. Либо иметь заранее определенную последовательность которая кодом символа быть не может - например 101010011111 Где 101 код первого символа 0100 разделитель 11111 второй симовл и т.д.
Имея и тот и другой вариант работа с битами будет заключаться в следующем: 1. Считать все данные. 2. Если запись линейна, то.... а) считываем байт и считаем сколько битов считано. Если считано меньше - т.е. 8 бит дестибитного числа, то задвигаем его влево на остаток - в данном случае 2 бита. в) читаем следующий байт. Вычленяем с помощью & бинарного сложения два верхних бита и так же с помощью "или" операции заталкиваем их в два нужных битпа первого числа... Естественно, что держать нао число в формате в котором число бит в числе превысит макс возможную длину полученного кода - в примере - это два байта.
При наличии разделительных символов - задача усложняется необходимостью отделения разделителей от данных.
Если ты файл создаешь сам, то я бы предпочел избыток данных чем разделитель... Найти точный не встречающийся нигде разделитель сложно.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Alf
Гость
|
|
« Ответ #3 : 07-03-2005 21:58 » |
|
Например, есть некоторая совокупность символов, каждый из которых кодируется двоичным числом с длиной кода не кратной длине байта - от 1 до 10 бит, т.е. а1=1, а2=101 и т.п.
А сколько всего может быть различных символов?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #4 : 08-03-2005 18:17 » |
|
Duke, а речь часом не о коде Хафмана?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Duke
Гость
|
|
« Ответ #5 : 08-03-2005 18:46 » |
|
>Duke, а речь часом не о коде Хафмана?
Почти, только длина кода зависит не от вероятности появления символа, а несколько от других параметров. Так что, на примере кода Хафмана можно. Каждый символ кодируется строго определённым кодом. Избыточность бы не хотелось вносить.
|
|
« Последнее редактирование: 08-03-2005 19:02 от Duke »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #6 : 08-03-2005 19:34 » |
|
Если все так совпадает, таки в чем проблема? Как считать N бит? Хотелось бы точно понять, что тебе надо.
|
|
« Последнее редактирование: 08-03-2005 20:06 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Duke
Гость
|
|
« Ответ #7 : 09-03-2005 06:07 » |
|
Если все так совпадает, таки в чем проблема? Как считать N бит? Хотелось бы точно понять, что тебе надо.
Я быть может спрашиваю для кого-то элементарные вещи, но я с программированием связан постольку-поскольку. Да проблема в том, как считать N bit. Впрочем, вроде из топика Грома (спасибо) я понял как это сделать.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #8 : 09-03-2005 06:44 » |
|
Дюк - просто считать нестандартную длину битов физически невозможно. Другое дело - зная длину в битах читать байт и потом работать с битами в памяти примерно как я описал, каждый себе сам алгоритм изобретает - но сдвиг влево, вправо, и бинарные и или не, никто не отменял
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 09-03-2005 09:17 » |
|
int get_bit(char * buf, int bit_number) { if(bit_numbaer & 7) return buf[bit_number >> 8] & (2 << bit_number); else return buf[bit_number >> 8] & 1; }
Код Хафмана: 0, 10, 110, 1110, ..., 1...1. Что делать: сосчитать число последовательных единиц до ноля, но не более N (максимальная длина кода). На выходе: число 0...N.
|
|
« Последнее редактирование: 09-03-2005 14:39 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #10 : 09-03-2005 09:22 » |
|
RXL - исходя из примера я все же скажу, что формально buf реально один элемент его все равно 8 бит и читать в него из файла все равно только по 8 бит можно
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #11 : 09-03-2005 14:46 » |
|
Не понял - что значит "формально buf реально один элемент"?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #12 : 10-03-2005 09:24 » |
|
РЕально минимально возможное считываемое колличество бит программой из физического фалйа 8 = 1 байт. Меньше типа данных нет. В вопросе было как считать ... В твоей функции ты тоже оперируешь с buf типа char * что означает 8 бит. Отсюда и решил упомянуть, что изически сичтываются в память и в памяти содержатся единицы данных 1 байт = 8 бит, просто мы можем алгоритмизруя создать битовые обращения, маски и передачу 1-го бита... НО НЕ СЧИТЫВАНИЕ.
Вот что имелось ввиду.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Alf
Гость
|
|
« Ответ #13 : 10-03-2005 09:31 » |
|
Читать побитово - не проблема, достаточно буфера на байт (либо слово). Читаем же дисковые файлы посимвольно, хотя на самом деле обмен с диском посекторный. Буфер эти тонкости спрячет.
Другое дело - надо ли? На вопрос о символьном наборе автор упорно не желает отвечать, а без этого непонятно.
|
|
|
Записан
|
|
|
|
OSokin
Гость
|
|
« Ответ #14 : 15-05-2005 12:45 » |
|
Считать по ( bitscount div 8 )+1 байт и побайтно пересчитывать биты... Лично я делаю так (на Делфи): делаю массив на 8 boolean'ов, проверяю, больше ли этот байт 2*n степени. Если да, но вычитаю из него 2*n и ставлю соотв. бит true, если нет - false.
|
|
« Последнее редактирование: 20-12-2007 21:10 от Алексей1153++ »
|
Записан
|
|
|
|
|