Текущий архив: 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.56 MB
Время: 0.043 c