![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как считать файл по битам? [D7, WinXP]
чип © (2005-05-26 20:39:00)Подскажите, можно ли считать файл в двоичном виде, не побайтно, а побитно, т.е. в виде 0 и 1. Имеется в виду не преобразовывать на ходу, а именно сразу читать побитно.
Alex Konshin (2005-05-27 14:02:00) [101]Defunct © (27.05.05 12:29) [40]
isasa © (27.05.05 10:42) [39]
небольшие поправки:
Чтение с диска идет побитово.
большие поправки:
- чтение с поверхности дискаидет побитово (на самом деле это тоже еще темное дело). Кстати, как я уже тут обращал внимание, порядок записи битов может быть отличным от того принятого в i486. У меня стойкое подозрение, что там даже порядок байт другой (переставлены четный и нечетный байт), по крайней мере это видно по результату команды IDENTIFY.
- чтение с диска в память - блоками, никаких битов там нет, то есть нет никакой возножности выделить единичный бит.
Defunct (2005-05-27 12:29:00) [102]isasa © (27.05.05 10:42) [39]
небольшие поправки:
Чтение с диска идет побитово.
Битовые цепочки еще вдобавок кодированы (RLL).
Объем буфера ограниченный (цилиндр туда не поместится).
По SATA данные передаются побитово
ну а в остальном все как Вы и говорите.
С уважением,
def
isasa (2005-05-27 10:42:00) [103]Касается дисковых операций.
Эсли абстрагироваться от всего, то
при одином обороте шпинделя (1/7200 сек) в буфере находится
содержимое одного цилиндра (1 трек х к-во поверхностей) хочеш ты того, или нет.
Вот и подумай, что быстрее, выковыривать оттуда биты, млм передать блок целиком,
и потом с ним разбираться побитово, побайтово, пословно....
Defunct (2005-05-27 04:19:00) [104]Приведу удобный, с моей точки зрения, объект для работы с битами:
unit uRegPrimitive;
interface
type
TRegister = object
private
fValue : Cardinal;
fMax : Cardinal;
fCarry : Byte;
fWL : Byte;
public
procedure WHex( Value : Cardinal ); // Записать слово
procedure WBit( N, Bit: Byte); // Записать бит номер N (N Є 0..(WL-1), Bit Є {0, !0} )
function RBit(N:Byte):Byte; // Прочитать бит номер N (N Є 0..(WL-1) )
function RHex:Cardinal; // Прочитать слово
function Carry:Byte; // Перенос (автоматически сбрасывает при чтении)
function Parity:Byte; // Четность
constructor Init(WordLength:Byte); // Инициализация разрядности
destructor Done; // разрушение объекта, В Delphi необязательно вызывать
end;
implementation
uses SysUtils;
const
{$ifndef dos}
Platform_Type = 32;
{$else}
Platform_Type = 16;
{$endif}
{$ifdef dos}
type Cardinal = WORD;
{$endif}
{******************************}
{******** TRegister ***********}
{******************************}
var ZMask, AMask : Array[0..Platform_Type] of Cardinal;
constructor TRegister.Init(WordLength: Byte);
begin
if (WordLength > 0) and (WordLength <= Platform_Type) then
begin
fWL := WordLength;
fMax := AMask[WordLength] - 1;
end
else
raise Exception.Create('Could not initialize register');
end;
function TRegister.Carry: Byte;
begin
Result := fCarry;
fCarry := 0
end;
function TRegister.Parity: Byte;
var
i : integer;
ActiveCount : integer;
begin
ActiveCount := 0;
for i := 0 to fWL - 1 do
if RBit(i)<>0 then
inc(ActiveCount);
Result := (ActiveCount and 1);
end;
function TRegister.RBit(N: Byte): Byte;
begin
if N < fWL then
Result := Byte((fValue and AMask[N]) <> 0 )
else
raise Exception.Create('index out of bound')
end;
function TRegister.RHex: Cardinal;
begin
Result := fValue
end;
procedure TRegister.WBit(N, Bit: Byte);
begin
if N < fWL then
begin
if Bit <> 0 then
fValue := fValue or AMask[N]
else
fValue := fValue and ZMask[n]
end
else
raise Exception.Create('index out of bound');
end;
procedure TRegister.WHex(Value: Cardinal);
begin
if Value > fMax then
begin
fValue := Value and fMax;
fCarry := 1
end
else
begin
fValue := Value;
fCarry := 0
end
end;
destructor TRegister.Done;
begin
end;
{******************************}
procedure Platform_Init;
var
i : integer;
A : Cardinal;
begin
for i := 0 to Platform_Type - 1 do
begin
A := 1 shl i;
AMask[i] := A;
ZMask[i] := not A
end
end;
initialization
Platform_Init
finalization
end.
Strech (2005-05-27 02:10:00) [105]перефразируя анекдот:
- Считал я несколько битов с диска, подскажите, как мне вернуть их обратно?
- Вот из за таких козлов, как ты, на диске совсем битов не осталось.
Просто Джо (2005-05-27 01:28:00) [106]
> [35] KilkennyCat © (27.05.05 01:27)
Если у Васька - докторская степень, то придется, пожалуй, согласиться-с :)
KilkennyCat (2005-05-27 01:27:00) [107]Это [32] Marser © (27.05.05 00:34) - доказательство науки? :))
Просто Джо (2005-05-27 00:51:00) [108]Существование битов в природе наукой не доказано-с ;^)
KilkennyCat (2005-05-27 00:39:00) [109]
> Давеча с Васькомоткрыли посмотреть чаво это в ейномвинчестере
>
> "А в каком порядке должны считываться биты?"
В обратном записыванию, чтоб лишний раз голвами не дергать.
Marser (2005-05-27 00:34:00) [110]
> Темное это дело, темное :))
Давеча с Васьком открыли посмотреть чаво это в ейном винчестере за биты лежат. И нишиша там не было никаких битов, тока железяка какая-то...
Alex Konshin (2005-05-27 00:32:00) [111]Почему никто не задал вопрос на засыпку: "А в каком порядке должны считываться биты?"
Просто Джо (2005-05-27 00:32:00) [112]
> [27] Игорь Шевченко © (27.05.05 00:22)
> А на диске файлы побитно лежат :P
Темное это дело, темное :))
Marser (2005-05-27 00:23:00) [113]
> Игорь Шевченко © (27.05.05 0:22) [27] [Новое
>сообщение][Ответить]
> А на диске файлы побитно лежат :P
Ну так выковырять надо оттуда.
KilkennyCat (2005-05-27 00:23:00) [114]
> [27] Игорь Шевченко © (27.05.05 00:22)
Уверены? :))
Игорь Шевченко (2005-05-27 00:22:00) [115]А на диске файлы побитно лежат :P
KilkennyCat (2005-05-27 00:09:00) [116]
> [25] Просто Джо © (27.05.05 00:07)
Скажи несколько раз "какашка" и все пройдет :)
Просто Джо (2005-05-27 00:07:00) [117]
> [24] Marser © (27.05.05 00:04)
А это, мой юный друг, расскажите, пожалуйста, глубокоуважаемому Чипу :))
Тьху, совсем меня Керк и KilcennyCat с тона сбили :)
Marser (2005-05-27 00:04:00) [118]
> Человек утверждает, что "так быстрее" ;))
Ага. Только за то время, пока споследовательно пройдет бит, паралельно проскочит то ли 8, то ли 16, а то ли 32 :-)
Marser (2005-05-27 00:03:00) [119]Нельзя.
Mx (2005-05-26 23:53:00) [120]А какой смысл в такой операции? Че то я не въезжаю. Открыл файлик и пошел, считал блок, проанализировал биты. От этого, как мне кажется, прога ничего в скорости не потеряет. Даже наоборот, меньше возьни со всякими низкоуровневыми менеджерами и т.п.