Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

Побитовое считывание файла   Найти похожие ветки 

 
J_SABER ©   (2007-01-19 10:58) [0]

Как  можно побитово считывать файл?


 
Плохиш ©   (2007-01-19 11:01) [1]


> J_SABER ©   (19.01.07 10:58)  
> Как  можно побитово считывать файл?

Ну, к примеру, читая партиями по 8 бит.


 
novill ©   (2007-01-19 11:06) [2]

минимальная единица считываения файла - байт. А из байта вытаскивай биты так, как тебе удобно.


 
Zeqfreed ©   (2007-01-19 11:06) [3]

Смотря откуда считывать. На современном оборудовании, считать битами не получится даже при большом старании :) А вот организовать побитовый доступ к информации - это можно.


 
TRUNK ©   (2007-01-19 12:01) [4]

Вот функции для чтения/записи произвольных битов (если нужны функции для чтения/записи последовательных битов могу и их написать):


var
 DataMemory: Pointer; // адрес, по к-рому содержатся данные
 DataSize: Integer; // размер данных

function ReadBit(BitIndex: Cardinal): Boolean;
var
ByteIndex: Cardinal;
DataByte: Byte;
begin
Result := false; // чтобы не вылететь с неопределённым результатом
ByteIndex := BitIndex shr 3; // деление на 8
if (ByteIndex >= DataSize) then
 Exit;
BitIndex := BitIndex and $00000007; // остаток от деления на 8
DataByte := PByte(Cardinal(DataMemory) + ByteIndex)^;
Result := (DataByte and (1 shl BitIndex)) <> 0;
end;

procedure WriteBit(BitIndex: Cardinal; Bit: Boolean);
var
ByteIndex: Cardinal;
DataByte: Byte;
begin
ByteIndex := BitIndex shr 3; // деление на 8
if (ByteIndex >= DataSize) then
 Exit;
BitIndex := BitIndex and $00000007; // остаток от деления на 8
DataByte := PByte(Cardinal(DataMemory) + ByteIndex)^;
if Bit then
 DataByte := DataByte or (1 shl BitIndex) // устанавливаем бит
else
 DataByte := DataByte and not(1 shl BitIndex); // очищаем бит
PByte(Cardinal(DataMemory) + ByteIndex)^ := DataByte;
end;


 
palva ©   (2007-01-19 12:48) [5]


> Как  можно побитово считывать файл?

Неизвестно, что это такое. Неизвестно, например, какой бит в байте считать первым, а какой вторым.


 
Джо ©   (2007-01-19 12:57) [6]

> [5] palva ©   (19.01.07 12:48)
>
> > Как  можно побитово считывать файл?
>
> Неизвестно, что это такое. Неизвестно, например, какой бит
> в байте считать первым, а какой вторым.

Ну, об этом можно без труда договориться :)


 
Anatoly Podgoretsky ©   (2007-01-19 14:32) [7]


> Неизвестно, что это такое. Неизвестно, например, какой бит
> в байте считать первым, а какой вторым.

Какая разница, это просто предмет договоренности.
И считывать тоже можно, но надо писать свои функции, поверх системных.


 
J_SABER ©   (2007-01-19 19:50) [8]

Мне просто нужно считать все биты(пускай даже и байтами) файла. Только не спрашивайте зачем :)


> TRUNK ©   (19.01.07 12:01) [4]
>
> Вот функции для чтения/записи произвольных битов (если нужны
> функции для чтения/записи последовательных битов могу и
> их написать):

Напиши пожалуйста.


 
Джо ©   (2007-01-19 19:54) [9]

> [8] J_SABER ©   (19.01.07 19:50)
> Мне просто нужно считать все биты(пускай даже и байтами)
> файла. Только не спрашивайте зачем :)

Пожалуй, любое «считывание» файла будет битовым (пускай даже байтовым).


 
Джо ©   (2007-01-19 20:05) [10]

> [8] J_SABER ©   (19.01.07 19:50)
> Напиши пожалуйста.

Есть такая штука, как логические операторы.
На основе их легко написать функцию, проверяющую установку конкретного бита, например:

function BitSet (const Value, BitNum: Byte): Boolean;
begin
 Result := (Value and (1 shl BitNum)) <> 0
end;

Будет проверять установку бита с номером BitNum в байте Value, где нумерация битов в пределах 0-7.


 
Германн ©   (2007-01-20 00:48) [11]


> Джо ©   (19.01.07 20:05) [10]

Посылай их в подобных случаях в "лицей Королевства" http://www.delphikingdom.com/lyceum/
Зря что-ли наши мастера старались, что-ли? :)


 
Джо ©   (2007-01-20 01:09) [12]

Да забыл ссылку, а искать лень было :)


 
TRUNK ©   (2007-01-20 14:36) [13]


> J_SABER ©   (19.01.07 19:50) [8]
> Напиши пожалуйста.


// Часть 1 из 3

const
 BlockSize = 512; // файл читаем блоками по 512 байт

var
 FileHandle: THandle;
 FileSize: Cardinal;
 BlockBuffer: array[0..BlockSize-1] of Byte;
 BitIndex: Cardinal; // 0..7
 ByteIndex: Cardinal; // 0..(BlockSize-1)
 BlockIndex: Cardinal;
 BlockChanged: Boolean;

function OpenFile(FileName: string): Boolean;
begin
if (FileHandle <> INVALID_HANDLE_VALUE) then
 CloseFile;
FileHandle := CreateFile(PChar(FileName),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_FLAG_RANDOM_ACCESS,0);
Result := FileHandle <> INVALID_HANDLE_VALUE;
if Result then
 begin
 FileSize := GetFileSize(FileHandle,nil);
 BitIndex := 0;
 ByteIndex := 0;
 BlockIndex := 0;
 LoadBlock;
 end;
end;

procedure CloseFile;
begin
if (FileHandle = INVALID_HANDLE_VALUE) then
 Exit;
if BlockChanged then
 SaveBlock;
CloseHandle(FileHandle);
FileHandle := INVALID_HANDLE_VALUE;
FileSize := 0;
end;


 
TRUNK ©   (2007-01-20 14:39) [14]

// Часть 2 из 3


procedure LoadBlock;
var
NumBytes: Cardinal;
begin
FillChar(BlockBuffer,BlockSize,0);
SetFilePointer(FileHandle,BlockIndex*BlockSize,nil,FILE_BEGIN);
ReadFile(FileHandle,BlockBuffer,BlockSize,NumBytes,nil);
BlockChanged := false;
end;

procedure SaveBlock;
var
NumBytes: Cardinal;
begin
SetFilePointer(FileHandle,BlockIndex*BlockSize,nil,FILE_BEGIN);
WriteFile(FileHandle,BlockBuffer,BlockSize,NumBytes,nil);
FileSize := GetFileSize(FileHandle,nil);
BlockChanged := false;
end;

procedure SetPosition(BitPos: Cardinal);
var
NewBlockIndex: Cardinal;
begin
if (BitPos >= FileSize*8) then
Exit;
ByteIndex := BitPos div 8;
BitIndex := BitPos mod 8;
NewBlockIndex := ByteIndex div BlockSize;
ByteIndex := ByteIndex mod BlockSize;
if (NewBlockIndex <> BlockIndex) then
 begin
 if BlockChanged then
   SaveBlock;
 BlockIndex := NewBlockIndex;
 LoadBlock;
 end;
end;


 
TRUNK ©   (2007-01-20 14:42) [15]

// Часть 3 из 3


function ReadBit: Boolean;
begin
Result := false;
if (BlockIndex*BlockSize + ByteIndex) >= FileSize then
Exit;
Result := (BlockBuffer[ByteIndex] and (1 shl BitIndex)) <> 0;
BitIndex := BitIndex + 1;
if (BitIndex >= 8) then
 begin
 BitIndex := BitIndex - 8;
 ByteIndex := ByteIndex + 1;
 if (ByteIndex >= BlockSize) then
   begin
   if BlockChanged then
     SaveBlock;
   ByteIndex := ByteIndex - BlockSize;
   BlockIndex := BlockIndex + 1;
   LoadBlock;
   end;
 end;
end;

procedure WriteBit(Bit: Boolean);
begin
if Bit then
BlockBuffer[ByteIndex] := BlockBuffer[ByteIndex] or (1 shl BitIndex)
else
BlockBuffer[ByteIndex] := BlockBuffer[ByteIndex] and not(1 shl BitIndex);
BlockChanged := true;
BitIndex := BitIndex + 1;
if (BitIndex >= 8) then
 begin
 BitIndex := BitIndex - 8;
 ByteIndex := ByteIndex + 1;
 if (ByteIndex >= BlockSize) then
   begin
   SaveBlock;
   ByteIndex := ByteIndex - BlockSize;
   BlockIndex := BlockIndex + 1;
   LoadBlock;
   end;
 end;
end;


 
J_SABER ©   (2007-01-20 20:08) [16]

TRUNK
Большое спасибо!



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

Текущий архив: 2007.02.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.081 c
5-1148224234
jb
2006-05-21 19:10
2007.02.04
MouseWeel


2-1169118742
derStutent
2007-01-18 14:12
2007.02.04
Math


3-1163087015
evgenij_
2006-11-09 18:43
2007.02.04
FTP Access копирование


9-1142684145
vrem
2006-03-18 15:15
2007.02.04
Rage 3D


1-1165939315
Dmitry_177
2006-12-12 19:01
2007.02.04
Сообщение при нажатии на кнопку "свернуть все окна"