Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2012, 17:57   #1
retroguy
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 11
По умолчанию Запись бинарных данных в TStream

Нужно записать 1 бит информации типа TBits в TStream.
Перекопал кучу инфы в нете. Есть запись чего угодно кроме битов. Кто подскажет как реализовать?
retroguy вне форума Ответить с цитированием
Старый 20.04.2012, 18:10   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Никак. Минимальная единица записи/чтения - 1 байт. А информации типа TBits нет, это компонент со своими возможностями
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.04.2012, 22:08   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

А в лоб нельзя сделать ? Пишем тупо в каждый байт по 8 битов из bits
Код:
procedure WriteBits(fs: tfilestream; bits:tbits);
var 
  b: byte;
  i : integer;
begin
  for i := 0 to bits.size - 1 do
  begin
    if i mod 8 = 0 then
    begin
      fs.write(b, sizeof(b));
      b = 0;
    end;
    b := b or (bits[i] shl (i mod 8));
  end;
end;
Как-то так, написал тут без проверки.
Альтернативный способ писать просто байт на каждый бит, правда в 8 раз файлик увеличится.

Последний раз редактировалось phomm; 21.04.2012 в 22:13.
phomm вне форума Ответить с цитированием
Старый 22.04.2012, 15:24   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

retroguy, тебе может надо всё же набор битов записать - последовательно, по одному биту?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 24.04.2012, 12:36   #5
retroguy
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 11
По умолчанию

phomm,
С битами в Делфи честно говоря, не очень. Но здесь просто нужно записать свои биты в блоб поле. Думал через потоки решу вопрос. Но удостоверился в том, что Делфи в битами, мягко говоря не очень.
За код огромное спасибо. Направление понял.
Но вот здесь
b := b or (bits[i] shl (i mod 8));
вылетает
[Error] ххх.pas(1119): Operator not applicable to this operand type

Кста, TFileStream не совсем оно, но конечно, особой разницы не вижу.

Последний раз редактировалось retroguy; 24.04.2012 в 12:50.
retroguy вне форума Ответить с цитированием
Старый 24.04.2012, 13:14   #6
retroguy
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 11
По умолчанию

типа того, и положить в блоб
retroguy вне форума Ответить с цитированием
Старый 24.04.2012, 13:15   #7
retroguy
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
retroguy, тебе может надо всё же набор битов записать - последовательно, по одному биту?
типа того, и положить в блоб
retroguy вне форума Ответить с цитированием
Старый 24.04.2012, 14:16   #8
retroguy
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 11
По умолчанию

Итак, конечный рабочий вариант:
Код:
procedure WriteBitsToStream(Stream: TMemoryStream; Bits: TBits);
var
  b : byte;
  i : integer;
  finish : Boolean; // индикатор "дописаности" байта
begin
  b := 0;

  for i := 0 to Bits.size-1 do
  begin
    finish := false; // указываем что байт не дописан
    b := ( b or (Integer(Bits[i]) shl (i mod 8)));

    if i = 7 then // если байт заполнился
    begin
      Stream.Write(b, sizeof(b)); // пишем его в поток
      b := 0;
      finish := true; // указываем, что байт дописан
    end;
  end;

  if not finish then // если байт не дописан
  begin
    Stream.Write(b, sizeof(b)); // пишем его в поток
    b := 0;
  end;
end;
Благодарю всех за участие.
Замечание по поводу исп. TFileStream беру обратно. Сам использовал TMemoryStream, т.к. TStream не годится для записи (вылетает Abtract error).
В блоб положил данные из TMemoryStream без проблем (с помощью LoadFromStream).

Цитата:
Никак. Минимальная единица записи/чтения - 1 байт. А информации типа TBits нет, это компонент со своими возможностями
Плохому танцору...

Отдельная благодарность phomm. Красава! Настоящий программист находит пути решения! Возможно не всегда приемлемые. Но рабочие

Последний раз редактировалось retroguy; 25.04.2012 в 10:54.
retroguy вне форума Ответить с цитированием
Старый 24.04.2012, 17:10   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Плохому танцору...
Цитата:
Нужно записать 1 бит информации типа TBits в TStream
Научитесь правильно вопрос задавать. То, что вам подсказали не один бит пишет в стреам, а последовательность байтов с двоичной информацией. По поводу танцоров в зеркало посмотрите
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.04.2012, 18:18   #10
retroguy
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Научитесь правильно вопрос задавать. То, что вам подсказали не один бит пишет в стреам, а последовательность байтов с двоичной информацией. По поводу танцоров в зеркало посмотрите
Не хотел никого обидеть. Вырвалось. И по поводу вопросов: в чем принципиальная разница в том, чтобы вместо 1-го бита записать 8-мь (или же последовательности бит)? Вы бы повнимательнее прочитали пост человека, что записать можно только количество кратное 8-ми битам. Именно поэтому и был дан ответ не совсем отвечающий строго на мой вопрос. Но принцип один и тот же!
retroguy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись данных в БД Tanzor69 PHP 7 04.02.2012 17:36
Запись данных данных из ListBox в файл Jrcfyf C# (си шарп) 3 20.01.2012 15:44
получение данных из файла и запись этих данных в другой. Jurii77 Microsoft Office Excel 9 23.11.2011 09:42
Конвертер бинарных данных royun Общие вопросы Delphi 5 30.08.2011 11:50
TStream Владимир1988 Помощь студентам 2 17.12.2009 10:16