Страница 1 из 2

Считывание по байтам

Добавлено: 31 окт 2006, 23:35
mazila-otzi
Помогите пожалуйста,если можно!
нужно файл читать по битам(байтам)
а потом с этими байтами "творить"
если можно,-то пожалуйста напишите как,например с *.doc "откусывать" по 1,скажем биту.
\\желательно с комментариями,и на делфи.


спасибо.

если я не так пользуюсь форумом напишите тоже,просто я на форуме 2 раз.
может что делаю не так!

Добавлено: 01 ноя 2006, 09:15
somewhere
По одному биту читать из файла у тебя не получиться, ибо размер считываемых записей измеряется в байтах - это наименьшая единица измерения. Манипуляции с битами выполняются уже с помощью сдвигов, AND-ов и (X)OR-ов. Редко с помощью других действий. Да и вообще читать из файла по биту - это все равно, что лететь в США за коробком спичек.

Лучше прочитать весь файл в буффер (массив), а потом работать с ним. А там хоть сколько битов кусай.
Если работаешь с "разнобойными" битами вот тебе пример функции:

Код: Выделить всё

Function GetBit(BitNumber:DWORD; var buffer:TByteArray):Byte;
begin
result := (buffer[BitNumber shr 3] shr (BitNumber mod 8)) and 1;
end;
Возвратит 1 или 0, BitNumber - порядковый номер бита в массиве, buffer - сам массив.

Добавлено: 01 ноя 2006, 09:19
somewhere
Но это конечно изврат, на каждым битом такие манипуляции проделывать, тут все от задачи зависит.

Добавлено: 02 ноя 2006, 00:04
mazila-otzi
всё таки нужны байты.
задача примерно следующая.
берём байт "ксорим" его с числом(ключ) потом ещё сдвигаем для большей стойкости и пишем куда-либо.(стойкость имеется в виду алгоритма)

Это у меня пары криптографии начались,а я в программировании дуб дубом.
сидел пробовал что мог ничего не получилось.

а с битами мы будем сдвигать,так как ты и сказал xor.

Добавлено: 02 ноя 2006, 09:40
somewhere
Это уже отдельная тема.

Поэтапно:
1. Читаем блок из файла в буффер
2. Кодируем
3. Пишем обратно в этот же или в другой файл.

Грубо говоря:

Код: Выделить всё

Procedure Coding(var B: PByteArray; Size: Integer);
var X:Integer;
begin
For X:=0 to Size-1 do B[X] := B[X] Xor Key;
end;
......
......
while not eof(F) do
    begin
    Blockread(F, buf, bufsize, numread);
    Coding(buf, numread);
    Seek(F, filepos(F)-numread);
    Blockwrite(F, buf, numread);
    end;
Это если Key - байт, вообще лучше было бы сделать Key - DWORD или побольше - тогда эффект был бы уже заметен. А такой крипт никак не защищает - те, кто знают заголовки и форматы файлов без труда найдут этот Key ;-)
Насчет сдвига - если через Pascal - придется поизвратиться, так как нет комманд циклического вращения, но сделать можно. Или можно так:

Код: Выделить всё

A := B[X];
asm
push ax
push cx
mov al, A
xor al, key
mov cl, numshifts
rol al, cl
mov A, al
pop cx
pop ax
end;
B[X] := A;

Добавлено: 02 ноя 2006, 12:53
mazila-otzi
спасибо огромное,во втором коде,если я правильно понял,мы ассемблером сдвигаем.
а в делфи вроде shr b shl.
Или он не будет работать?

Добавлено: 02 ноя 2006, 13:31
somewhere
ROR(ROL) - циклический сдвиг, т.е. если сдвигаем вправо на 1 бит, то 0 бит идет в 7-ой (в зависимости от размера операнда в 15, или 31)
SHR(SHL) - логический сдвиг, т.е. если сдвигаем вправо на 1 бит, то значение 0 бита теряется, а 7-ой заполняеться нулем (или 15-ый и 31-ый)

Есть также RCL, RCR (циклическое вращение с учетом флага С) - но это все на ассемблере.
В Дельфе же есть только SHL и SHR. В твоем случае их употреблять взамен ROR и ROL НЕЛЬЗЯ из-за невозможности обратного преобразования (т.к. теряются крайние биты)

Добавлено: 02 ноя 2006, 13:38
somewhere
Взамен могу предложить комбинации, дающие тот же эффект:

ROL (Op, X) = (Op SHL X) or (Op SHR (8-X))

При размере операнда 8 бит
Вращение влево (направо додумаешься сам)
Op - операнд
Х - число битов для сдвига

Добавлено: 03 ноя 2006, 13:42
mazila-otzi
for (i=0;i<8;i++){
//ch=key^ch;

ch1=ch+128;
ch1=(ch1<<3)^(ch1>>5);
ch1=key^ch1;
ch=ch1-128;
}



if (choise=='d')

for (i=0;i<8;i++){


ch1=ch+128;
ch1=key^ch1;
ch1=(ch1>>3)|(ch1<<5);
ch=ch1-128;

}




fwrite(ch,1,8,outfile);
fread(ch,1,8,infile);


это на вижуал С++,там этот сдвиг используют.
просто мне С++ не очень понятен,Делфи мне легче понять.
в этом тексте представлено шифрование и расшифрование.
вот мне нужно что-то типа этого на делфи.
в С тоже после сдвига биты заполняются 0.
но потом при сдвиге обратном всё получается нормально

Добавлено: 03 ноя 2006, 13:52
somewhere
ROL (Op, X) = (Op SHL X) or (Op SHR (8-X))
и
ch1=(ch1<<3)^(ch1>>5);
улови аналогию.