| 
			| 
					
						| 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 | 
								|  | « Ответ #4 : 08-03-2005 18:17 »  |  | 
 
 Duke, а речь часом не о коде Хафмана? |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Duke 
								Гость
 | 
								|  | « Ответ #5 : 08-03-2005 18:46 »  |  | 
 
 >Duke, а речь часом не о коде Хафмана?
 Почти, только длина кода зависит не от вероятности появления символа, а несколько от других параметров. Так что, на примере кода Хафмана можно.
 Каждый символ кодируется строго определённым кодом.
 Избыточность бы не хотелось вносить.
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 08-03-2005 19:02 от Duke » |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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++ » |  Записан | 
 |  |  | 
	|  |