Страница 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);
улови аналогию.