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

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

Как считать файл по битам? [D7, WinXP]


Страницы:   1 2 3 4 5 6 7 8

чип ©   (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]

А какой смысл в такой операции? Че то я не въезжаю. Открыл файлик и пошел, считал блок, проанализировал биты. От этого, как мне кажется, прога ничего в скорости не потеряет. Даже наоборот, меньше возьни со всякими низкоуровневыми менеджерами и т.п.


Страницы:   1 2 3 4 5 6 7 8

Наверх

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