![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
биты
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, ни как-нибудь еще.