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

Вниз

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

 
чип   (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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.042 c
4-1116411956
lehich
2005-05-18 14:25
2005.07.31
кодировка и clipboard


4-1117438560
Гость2
2005-05-30 11:36
2005.07.31
Как добавить иконку в заголовок окна?


1-1120997275
xroot
2005-07-10 16:07
2005.07.31
Абсолютные координаты компонента


4-1117696813
Chaser
2005-06-02 11:20
2005.07.31
Вытащить текст из компонента, находящегося в другой программе


1-1121085518
Viktop
2005-07-11 16:38
2005.07.31
Встроить срь в Delphi





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