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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.058 c
2-1169118311
FIL-23
2007-01-18 14:05
2007.02.04
как узнать номер позиции указателя в таблице?


2-1169110118
dsa256
2007-01-18 11:48
2007.02.04
Форма окна по контуру картинки


2-1169128955
hypnotize
2007-01-18 17:02
2007.02.04
Проблема с TLabel


3-1163498274
Чапаев
2006-11-14 12:57
2007.02.04
Что бы такое raise нуть?..


2-1169158460
AlexeyT
2007-01-19 01:14
2007.02.04
Печать TImage/TBitmap?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский