Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

биты


cando ©   (2006-08-02 18:14:00) 

как осушествить в delphi побитное чтение и запись файла


Desdechado   (2006-08-03 11:02:00) [1]

palva ©   (03.08.06 09:29) [14]
Буферизация, чтение блоками - это епархия операционки. Хочет - буферизует, хочет - нет. Доступ к файлу все равно побайтный.
Способ хранения в виде потока байтов все равно никуда не денется.


Palladin   (2006-08-03 09:47:00) [2]

У, блин... буквоед...


palva   (2006-08-03 09:29:00) [3]

Физически запись и чтение с диска осуществляется блоками. Размер блока может быть разным, но уж точно за сотни байтов. Так что даже один байт записать на диск невозможно. Другое дело, что у программиста на паскале есть возможность организовать программу так, как будто он пишет или читает по одному байту, хотя на самом деле программа будет буферизовать ввод/вывод. Так же точно можно написать программы, которые имитировали бы битовый вывод, но стандартных средств для этого в паскале нет.


isasa   (2006-08-03 09:04:00) [4]

:)
Я бы даже добавил.
Выборка из буфера устройства ввода/вывода - минимум побайтовая.
Так, на всякий случай. Что-бы не было ...
Сказки, фантазии, иллюзии...


Anatoly Podgoretsky   (2006-08-02 22:42:00) [5]

Джо ©   (02.08.06 22:34) [11]
По русски - лапша


Джо   (2006-08-02 22:34:00) [6]

> [10] Ketmar ©   (02.08.06 22:22)
> враньё. чтение тут побайтовое.

Не вранье. Сказки, фантазии, иллюзии... 8)


Ketmar   (2006-08-02 22:22:00) [7]

> [9] Rial ©   (02.08.06 21:33)


> Чтение побитовое:

враньё. чтение тут побайтовое.


Rial   (2006-08-02 21:33:00) [8]

Чтение побитовое:

Type
       TByteBuffer=Array[0..7] of Byte;

Var F : Integer;
    BB : TByteBuffer;
    BPos, Pos, Len : Integer;

function ReadBit : Byte;
Var B : Byte;
    I : Integer;
begin
If (BPos>=7)then begin
 ReadFile(F, B, SizeOf(B));
 For I :=8 downto 1 do begin
  A[I] :=B and 1;
  B :=B shr 1;
 end;
 Inc(Pos);
 BPos:=0;
end;
Result:=BB[BPos];
Inc(BPos);
end;

function GetSize: Int64;
var
 Pos: Int64;
begin
 Pos := FileSeek(F, 0, 1);
 Result := FileSeek(F, 0, 2);
 FileSeek(F, Pos, 0);
end;

Var Bit : Byte;
begin
F:=FileOpen('...', fmOpenRead or fmShareDenyWrite);
Try
 Pos:=-1;
 BPos:=8;
 Len:= GetSize;
If (Len >0)then
 While (Pos < Len)do
  Bit:=ReadBit;
Finally
 FileClose(F);
end;
end;


Степан   (2006-08-02 21:30:00) [9]

Например так...

type TBit = 0..1;
type TByteBits = array [0..7] of TBit;

...

// Старший бит - индекс 0, младший 7 (можно и наоборот)
function ByteToBits(Value: Byte): TByteBits;
var
 I: Integer;
 Temp: Byte;
begin
 for I := 0 to 7 do begin
   Temp := Value;
   Temp := Temp shl I; (или 7 - I, если наоборот)
   Temp := Temp shr 7;
   Result[I] := Temp;
 end;
end;


А потом работешь с этим массивом, работаешь и...

function BitsToByte(Bits: TByteBits): Byte;
var
 I: Integer;
 Temp: Byte;
begin
 Result := 0;
 for I := 0 to 7 do begin
   Temp := Bits[I];
   Temp := Temp shl (7 - I);
   Result := Result or Temp;
 end;    
end;


Вот так приблизительно... ВНИМАНИЕ! Код на Делфи не проверен, поэтому, если что, исправляй, редактируй, улучшай...


tesseract   (2006-08-02 21:23:00) [10]

> Мельче, чем байт в языках высокого уровня наврятли можно
> считать/записать...


Минимально адресуемая область памяти байтом и называется.


> [0] cando ©   (02.08.06 18:14)


если нужно проверить бит в файле, считай байт и разложи его на биты.


Джо   (2006-08-02 21:18:00) [11]

> Степан


> Rial ©

Ребята, не нужно своими фантазиями вводить в заблуждение начинающих, пожалуйста.


Степан   (2006-08-02 21:15:00) [12]

Мельче, чем байт в языках высокого уровня наврятли можно считать/записать... Так что написанный выше пример [4] Rial © будет читать БАЙТ как минимум, но не бит! Конечно, можно для удобства на крайняк перефигачивать байт в массив битов


Rial   (2006-08-02 21:10:00) [13]

А так ?

Type
       TBit = 0..1;

Var F : File of TBit;
    B : TBit;
begin
Assign(F,'...');
B:=1;
ReWrite(F, B, SizeOf(TBit));
Close(F);
end;

))


Anatoly Podgoretsky   (2006-08-02 20:48:00) [14]

А уж побитовую запись вообще выполнить невозможно.


Desdechado   (2006-08-02 18:18:00) [15]

Файл - это поток байтов. Все операции с ними только как с байтами или (надстройка) с логическими единицами, состоящими из байтов.


Джо   (2006-08-02 18:17:00) [16]

Побитное чтение осуществить нельзя ни в Delphi, ни как-нибудь еще.


Наверх

Титульная страница Поиск, карта сайта Написать письмо