Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

Работа с файлами   Найти похожие ветки 

 
AntonSh   (2004-10-20 14:30) [0]

Подскажите как в бинарный файл записать число в двоичном коде.
Что я имею ввиду: У меня есть переменная типа Integer (i := 101). Как мне записать это число в файл как битовое представление, тоесть когда я буду поблочно читать файл(блок по три бита) на выходе я должен получить число 5.


 
Jay   (2004-10-20 14:48) [1]

Преобразуешь в десятичное и спокойно записываешь в файл


 
AntonSh   (2004-10-20 14:49) [2]

А как это сделать? И каким образом мне потом считать 3 бита из файла?


 
Jay   (2004-10-20 14:54) [3]

str1 := IntToStr(i);
number := 0;
for j := 1 to str1 do
if str[j] = 1 then number := number + exp(j * ln(2));

Может где ошибся проверь..


 
Rem ©   (2004-10-20 14:55) [4]

>>поблочно читать файл(блок по три бита)
Трех бит недостаточно для представления десятичных цифр.

А писать/читать - как нетипизированный файл - BlockWrite/BlockWrite. Как преобразовывать цифры из двоичного формата в двоично-десятичный - отдельный разговор.


 
default ©   (2004-10-20 14:55) [5]

AntonSh   (20.10.04 14:49) [2]
единица адресации это байт, бит это единица информации
можешь считывать только кусками кратными байту
как сделано описано в книгах...это тема уж больно проста...

дурацкое всё-таки название-бинарное!о чём оно говорит?
да ни о чём если откинуть смысл который ему присвоили давно(приравняли к нетипизированному файлу)
все файлы бинарные потому ни о чём и не говорит, другое дело говорить нетипизированные - всё сразу понятно


 
Jay   (2004-10-20 14:56) [6]

В файл запишется не три бита, а один байт значение которого = 5


 
Cosinus ©   (2004-10-20 14:59) [7]


>... тоесть когда я буду поблочно читать файл(блок по три бита)
> на выходе я должен получить число 5

Ха! По сабжу -
for i:=1 to Length(IntToStr(Str))
 if S[i]=1 then Write(f,$ff)
           else Write(f,$00);

С чтением я думаю понятно, но на мой взгляд записывать число в таком виде это.. это... ну не знаю в общем слов просто нет. Записывать каждое число нужно в 1 а не 3 байта (и собственно почему 3? Максимально возможное число 7 что ли?).
Кстати, а откуда вылезает 101 этот? Откуда он берется, а то есть у меня одно легкое подозрение... ;)


 
begin...end ©   (2004-10-20 15:00) [8]


> AntonSh

Ну и зачем это надо делать? Почему бы не писАть в файл сразу число 5 (в нормальном виде)? Или файл используется ещё для каких-то целей? Поподробнее, пожалуйста.


 
Cosinus ©   (2004-10-20 15:02) [9]

Я ступил, вместо бит увидел байт. Сорри.
А по теме, все сказано уже в [1


 
AntonSh   (2004-10-20 15:03) [10]

Я обьясню зачем я это делаю. Мне надо сжимать строку(архивировать). Например строка - "Привет". Так как каждый символ это байт, то я присвоив букве П код 1001, р - 1011 и так далее подразумеваю эти коды как биты. Теперь записав это файл, он естевственно уменьшится. Может есть другой вариант?


 
default ©   (2004-10-20 15:06) [11]

AntonSh   (20.10.04 14:30)  
оно и так будет писать в битовом представлении
только поясни на счёт блоков по 3 бита(


 
Jay   (2004-10-20 15:07) [12]

Таким способом файл сжать не получится, потому что каждая буква в нём байт, а каждий символ, который ты питаешся записать тоже байт, почитай лучше про способы сжатия, например методом Хаффмана.


 
begin...end ©   (2004-10-20 15:08) [13]


> [10] AntonSh   (20.10.04 15:03)


> Теперь записав это файл, он естевственно уменьшится.

За счёт чего?


 
default ©   (2004-10-20 15:08) [14]

AntonSh   (20.10.04 15:03) [10]
у тебя слова состоят всего из 2^4=16 букв?


 
AntonSh   (2004-10-20 15:09) [15]

Читал я Хаффмана. Ну так там каждая буква и представляется битами. А записать их как?


 
begin...end ©   (2004-10-20 15:10) [16]

Одним битом ты можешь представить только две буквы.


 
Digitman ©   (2004-10-20 15:12) [17]


> Мне надо сжимать строку(архивировать).


тебе не хватает ZLib ?


> каждый символ это байт


в Юникоде - это 2 байта... так что утверждение неверно


> я присвоив букве П код 1001, р - 1011


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


> записав это файл, он естевственно уменьшится


велосипед изобретаешь


 
AntonSh   (2004-10-20 15:14) [18]

Подскажите тогда что нибудь простое и эффективное.


 
Jay   (2004-10-20 15:15) [19]

В байте 8 бит, делаешь строку, добавляешь к ней текущее число (естественно в бинарной форме), если строка > 8, отрезаешь восемь символов и пишешь в файл и так далее, распаковка наоборот, только в файл ещё надо записать полученые коды символов.


 
MBo ©   (2004-10-20 15:17) [20]

>AntonSh
Ну вот там, где ты читал о Хаффмане, и должна быть реализация битового потока. В книге Бакнелла, например, есть хорошая.
Можно и самому сделать с нуля или на основе TBits.


 
Jay   (2004-10-20 15:18) [21]

Самое простое пишешь просто текстовый файл, а потом с соответствующими параметрами запускаешь winrar или winzip, вот и все дела :))


 
AntonSh   (2004-10-20 15:22) [22]

Jay обьясни пожалуста свой метод с добавлением символов к строке. Что значит в бинарной форме и что за текущее число?


 
default ©   (2004-10-20 15:22) [23]

MBo ©   (20.10.04 15:17) [20]
ну и намудрил этот Бакнелл с O-нотацией...


 
Jay   (2004-10-20 15:28) [24]

Лушше используй [21], а если уж совсем нельзя, то объясняю:

К строку добавляешь двоичный код (строку) текущего символа, пока она не станет >= 8, так как в байте 8 бит, тоесть ты получаешь полный бит в двоичной форме (строку), преобразуешь её в десятичное (оно получится от 0 до 255) и записываешь в файл..
Ещё вопросы..


 
AntonSh   (2004-10-20 15:33) [25]

Всё спасибо разобрался



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.046 c
14-1097236306
Alone
2004-10-08 15:51
2004.10.31
Компьютер-розетка :)


3-1096530257
Nikolay_S
2004-09-30 11:44
2004.10.31
DBGridEh - как сделать нумерацию страниц при печати?


14-1097664594
Demetrius2003
2004-10-13 14:49
2004.10.31
Исходник joiner a


3-1096965656
Mitrofan
2004-10-05 12:40
2004.10.31
Утилита которая показывает загрузку сервера Firebird


1-1097594241
Wish
2004-10-12 19:17
2004.10.31
Как сохранить в INI свойства TFont a типа Bold или Italic?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский