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

Вниз

Как считать файл по битам?   Найти похожие ветки 

 
чип   (2005-05-26 20:39) [0]

Подскажите, можно ли считать файл в двоичном виде, не побайтно, а побитно, т.е. в виде 0 и 1. Имеется в виду не преобразовывать на ходу, а именно сразу читать побитно.


 
Просто Джо ©   (2005-05-26 20:39) [1]

Читать побитно нельзя.


 
KilkennyCat ©   (2005-05-26 20:44) [2]

сомневаюсь, что и побайтно можно.


 
VMcL ©   (2005-05-26 20:56) [3]

>>чип   (26.05.05 20:39)

Файлы и так в двоичном виде. Переформулируйте вопрос. Что конкретно нужно?


 
чип   (2005-05-26 21:05) [4]

VMcL
Вроде я написал понятно, что нужно - нужно прочитать файл по битам, т.е. последовательно получить значение каждого бита. Как прочитать побайтно- понятно, а можно ли по битам - вопрос.


 
Просто Джо ©   (2005-05-26 21:06) [5]


>  [2] KilkennyCat ©   (26.05.05 20:44)
> сомневаюсь, что и побайтно можно.

Физически кажись, будет читать кластерами. Или секторами(?). Не помню. Но общераспространеные высокоуровневые функции создают все-таки иллюзию побайтного чтения.
А побитно - нельзя даже теоретически, поскольку - хардверные особенности.
Вообще, присоединяюсь к  [3] VMcL ©   (26.05.05 20:56).


 
Yanis ©   (2005-05-26 21:07) [6]

To [4]
Тебе уже ответили.


 
Просто Джо ©   (2005-05-26 21:08) [7]


>  [4] чип   (26.05.05 21:05)


См. [1].
Что мешает читать как обычно, а потом уже анализировать нужные разряды в прочитанных данных?


 
чип   (2005-05-26 21:12) [8]

>  [7]
Технически ничего не мешает, но это ж лишние действия, соответственно, скорость чтения. Вопрос был в том, можно ли обойтись без этого


 
Просто Джо ©   (2005-05-26 21:14) [9]


>  [8] чип   (26.05.05 21:12)


???
Ты считаешь, что чтение побитно ускорило бы процесс?


 
чип   (2005-05-26 21:16) [10]

>  [9]
Я думаю, это было бы быстрее, нежели разбирать считанные байты по битам


 
Eraser ©   (2005-05-26 21:21) [11]

чип   (26.05.05 20:39)

Байт - наименьшая адресуемая величина памяти. Так что нельзя.


 
GLFox ©   (2005-05-26 21:25) [12]

Вообще, если речь идет о скорости, то быстрее всего читать блоками гораздо большими чем один байт, а лучше размером с кластер. Доподлинно известно, что операции в RAM производятся быстрее, чем дисковые.


 
Yanis ©   (2005-05-26 21:26) [13]

Бстрее считать один байт и "обработать его процессором" чем ~256 раз считывать с диска по одному, пускай даже и биту.


 
Yanis ©   (2005-05-26 21:29) [14]

2 [12]
Опередил :)


 
Eraser ©   (2005-05-26 21:30) [15]

GLFox ©   (26.05.05 21:25) [12]  
лучше размером с кластер. Доподлинно известно, что операции в RAM производятся быстрее, чем дисковые.


Если речь идёт о считывании из памяти, тогда уж лучше страницами памяти считывать.


 
GLFox ©   (2005-05-26 21:32) [16]

>>Eraser ©   (26.05.05 21:30) [15]
Речь идет о считывании с диска


 
VMcL ©   (2005-05-26 21:52) [17]

>>чип   (26.05.05 21:16) [10]

Наоборот.


 
SergP ©   (2005-05-26 22:24) [18]


>  чип   (26.05.05 20:39)
> Подскажите, можно ли считать файл в двоичном виде, не побайтно,
> а побитно, т.е. в виде 0 и 1. Имеется в виду не преобразовывать
> на ходу, а именно сразу читать побитно.


То, что нельзя - это одно. Но вот зачем такое могло понадобиться - вот это интерестно.?.


 
Просто Джо ©   (2005-05-26 22:26) [19]


> [18] SergP ©   (26.05.05 22:24)
Но вот зачем такое могло понадобиться
> - вот это интерестно.?.

Человек утверждает, что "так быстрее" ;))


 
SergP ©   (2005-05-26 22:50) [20]

ну насколько я себе представляю - то считывание можно производить на физическом уровне - посекторно (по 512 байт), а на уровне BIOS (или ОС???) - вообще покластерно..., Конечно могу ошибаться, но по крайней мере уж никак побайтно, тем более побитно...
А то что:


> Человек утверждает, что "так быстрее" ;))


то это пройдет со временем... :-))


 
KilkennyCat ©   (2005-05-26 23:47) [21]

На мой взгляд, ошибка не в этом. Большая ошибка здесь:

> разбирать считанные байты по битам


 
Mx ©   (2005-05-26 23:53) [22]

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


 
Marser ©   (2005-05-27 00:03) [23]

Нельзя.


 
Marser ©   (2005-05-27 00:04) [24]


> Человек утверждает, что "так быстрее" ;))

Ага. Только за то время, пока споследовательно пройдет бит, паралельно проскочит то ли 8, то ли 16, а то ли 32 :-)


 
Просто Джо ©   (2005-05-27 00:07) [25]


>  [24] Marser ©   (27.05.05 00:04)

А это, мой юный друг, расскажите, пожалуйста, глубокоуважаемому Чипу :))
Тьху, совсем меня Керк и KilcennyCat с тона сбили :)


 
KilkennyCat ©   (2005-05-27 00:09) [26]


>  [25] Просто Джо ©   (27.05.05 00:07)


Скажи несколько раз "какашка" и все пройдет :)


 
Игорь Шевченко ©   (2005-05-27 00:22) [27]

А на диске файлы побитно лежат :P


 
Marser ©   (2005-05-27 00:23) [28]


> Игорь Шевченко ©   (27.05.05 0:22) [27] [Новое
>сообщение][Ответить]
> А на диске файлы побитно лежат :P

Ну так выковырять надо оттуда.


 
KilkennyCat ©   (2005-05-27 00:23) [29]


> [27] Игорь Шевченко ©   (27.05.05 00:22)


Уверены? :))


 
Alex Konshin ©   (2005-05-27 00:32) [30]

Почему никто не задал вопрос на засыпку: "А в каком порядке должны считываться биты?"


 
Просто Джо ©   (2005-05-27 00:32) [31]


>  [27] Игорь Шевченко ©   (27.05.05 00:22)
> А на диске файлы побитно лежат :P

Темное это дело, темное :))


 
Marser ©   (2005-05-27 00:34) [32]


> Темное это дело, темное :))

Давеча с Васьком открыли посмотреть чаво это в ейном винчестере за биты лежат. И нишиша там не было никаких битов, тока железяка какая-то...


 
KilkennyCat ©   (2005-05-27 00:39) [33]


> Давеча с Васьком открыли посмотреть чаво это в ейном винчестере
>



> "А в каком порядке должны считываться биты?"


В обратном записыванию, чтоб лишний раз голвами не дергать.


 
Просто Джо ©   (2005-05-27 00:51) [34]

Существование битов в природе наукой не доказано-с ;^)


 
KilkennyCat ©   (2005-05-27 01:27) [35]

Это [32] Marser ©   (27.05.05 00:34) - доказательство науки? :))


 
Просто Джо ©   (2005-05-27 01:28) [36]


>  [35] KilkennyCat ©   (27.05.05 01:27)

Если у Васька - докторская степень, то придется, пожалуй, согласиться-с :)


 
Strech   (2005-05-27 02:10) [37]

перефразируя анекдот:
- Считал я несколько битов с диска, подскажите, как мне вернуть их обратно?
- Вот из за таких козлов, как ты, на диске совсем битов не осталось.


 
Defunct ©   (2005-05-27 04:19) [38]

Приведу удобный, с моей точки зрения, объект для работы с битами:

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.


 
isasa ©   (2005-05-27 10:42) [39]

Касается дисковых операций.
Эсли абстрагироваться от всего, то
при одином обороте шпинделя (1/7200 сек) в буфере находится
содержимое одного цилиндра (1 трек х к-во поверхностей) хочеш ты того, или нет.
Вот и подумай, что быстрее, выковыривать оттуда биты, млм передать блок целиком,
и потом с ним разбираться побитово, побайтово, пословно....


 
Defunct ©   (2005-05-27 12:29) [40]

isasa ©   (27.05.05 10:42) [39]

небольшие поправки:

Чтение с диска идет побитово.
Битовые цепочки еще вдобавок кодированы (RLL).
Объем буфера ограниченный (цилиндр туда не поместится).
По SATA данные передаются побитово

ну а в остальном все как Вы и говорите.

С уважением,
def



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

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

Наверх




Память: 0.57 MB
Время: 0.029 c
9-1113670911
Степан
2005-04-16 21:01
2005.07.31
Что такое Z-буфер, и для чего он нужен??


14-1120923281
dec
2005-07-09 19:34
2005.07.31
На чем лучше писать сервер ?


1-1121331079
Гость2
2005-07-14 12:51
2005.07.31
удаление файлов в папке


4-1116811498
boalse
2005-05-23 05:24
2005.07.31
Узнать серийный номер винта (не тома)....


1-1121063954
Andy BitOff
2005-07-11 10:39
2005.07.31
Word: запустить, проследить, узнать о результатах.