Считывание по байтам
Модераторы: Naeel Maqsudov, C_O_D_E
-
- Сообщения: 7
- Зарегистрирован: 24 окт 2006, 02:05
- Откуда: Белгород
Помогите пожалуйста,если можно!
нужно файл читать по битам(байтам)
а потом с этими байтами "творить"
если можно,-то пожалуйста напишите как,например с *.doc "откусывать" по 1,скажем биту.
\\желательно с комментариями,и на делфи.
спасибо.
если я не так пользуюсь форумом напишите тоже,просто я на форуме 2 раз.
может что делаю не так!
нужно файл читать по битам(байтам)
а потом с этими байтами "творить"
если можно,-то пожалуйста напишите как,например с *.doc "откусывать" по 1,скажем биту.
\\желательно с комментариями,и на делфи.
спасибо.
если я не так пользуюсь форумом напишите тоже,просто я на форуме 2 раз.
может что делаю не так!
По одному биту читать из файла у тебя не получиться, ибо размер считываемых записей измеряется в байтах - это наименьшая единица измерения. Манипуляции с битами выполняются уже с помощью сдвигов, AND-ов и (X)OR-ов. Редко с помощью других действий. Да и вообще читать из файла по биту - это все равно, что лететь в США за коробком спичек.
Лучше прочитать весь файл в буффер (массив), а потом работать с ним. А там хоть сколько битов кусай.
Если работаешь с "разнобойными" битами вот тебе пример функции:
Возвратит 1 или 0, BitNumber - порядковый номер бита в массиве, buffer - сам массив.
Лучше прочитать весь файл в буффер (массив), а потом работать с ним. А там хоть сколько битов кусай.
Если работаешь с "разнобойными" битами вот тебе пример функции:
Код: Выделить всё
Function GetBit(BitNumber:DWORD; var buffer:TByteArray):Byte;
begin
result := (buffer[BitNumber shr 3] shr (BitNumber mod 8)) and 1;
end;
It's a long way to the top if you wanna rock'n'roll
Но это конечно изврат, на каждым битом такие манипуляции проделывать, тут все от задачи зависит.
It's a long way to the top if you wanna rock'n'roll
-
- Сообщения: 7
- Зарегистрирован: 24 окт 2006, 02:05
- Откуда: Белгород
всё таки нужны байты.
задача примерно следующая.
берём байт "ксорим" его с числом(ключ) потом ещё сдвигаем для большей стойкости и пишем куда-либо.(стойкость имеется в виду алгоритма)
Это у меня пары криптографии начались,а я в программировании дуб дубом.
сидел пробовал что мог ничего не получилось.
а с битами мы будем сдвигать,так как ты и сказал xor.
задача примерно следующая.
берём байт "ксорим" его с числом(ключ) потом ещё сдвигаем для большей стойкости и пишем куда-либо.(стойкость имеется в виду алгоритма)
Это у меня пары криптографии начались,а я в программировании дуб дубом.
сидел пробовал что мог ничего не получилось.
а с битами мы будем сдвигать,так как ты и сказал xor.
help!!!!!!!!
Это уже отдельная тема.
Поэтапно:
1. Читаем блок из файла в буффер
2. Кодируем
3. Пишем обратно в этот же или в другой файл.
Грубо говоря:
Это если Key - байт, вообще лучше было бы сделать Key - DWORD или побольше - тогда эффект был бы уже заметен. А такой крипт никак не защищает - те, кто знают заголовки и форматы файлов без труда найдут этот Key ;-)
Насчет сдвига - если через Pascal - придется поизвратиться, так как нет комманд циклического вращения, но сделать можно. Или можно так:
Поэтапно:
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;
Насчет сдвига - если через 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;
It's a long way to the top if you wanna rock'n'roll
-
- Сообщения: 7
- Зарегистрирован: 24 окт 2006, 02:05
- Откуда: Белгород
спасибо огромное,во втором коде,если я правильно понял,мы ассемблером сдвигаем.
а в делфи вроде shr b shl.
Или он не будет работать?
а в делфи вроде shr b shl.
Или он не будет работать?
help!!!!!!!!
ROR(ROL) - циклический сдвиг, т.е. если сдвигаем вправо на 1 бит, то 0 бит идет в 7-ой (в зависимости от размера операнда в 15, или 31)
SHR(SHL) - логический сдвиг, т.е. если сдвигаем вправо на 1 бит, то значение 0 бита теряется, а 7-ой заполняеться нулем (или 15-ый и 31-ый)
Есть также RCL, RCR (циклическое вращение с учетом флага С) - но это все на ассемблере.
В Дельфе же есть только SHL и SHR. В твоем случае их употреблять взамен ROR и ROL НЕЛЬЗЯ из-за невозможности обратного преобразования (т.к. теряются крайние биты)
SHR(SHL) - логический сдвиг, т.е. если сдвигаем вправо на 1 бит, то значение 0 бита теряется, а 7-ой заполняеться нулем (или 15-ый и 31-ый)
Есть также RCL, RCR (циклическое вращение с учетом флага С) - но это все на ассемблере.
В Дельфе же есть только SHL и SHR. В твоем случае их употреблять взамен ROR и ROL НЕЛЬЗЯ из-за невозможности обратного преобразования (т.к. теряются крайние биты)
It's a long way to the top if you wanna rock'n'roll
Взамен могу предложить комбинации, дающие тот же эффект:
ROL (Op, X) = (Op SHL X) or (Op SHR (8-X))
При размере операнда 8 бит
Вращение влево (направо додумаешься сам)
Op - операнд
Х - число битов для сдвига
ROL (Op, X) = (Op SHL X) or (Op SHR (8-X))
При размере операнда 8 бит
Вращение влево (направо додумаешься сам)
Op - операнд
Х - число битов для сдвига
It's a long way to the top if you wanna rock'n'roll
-
- Сообщения: 7
- Зарегистрирован: 24 окт 2006, 02:05
- Откуда: Белгород
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.
но потом при сдвиге обратном всё получается нормально
//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.
но потом при сдвиге обратном всё получается нормально
help!!!!!!!!
иROL (Op, X) = (Op SHL X) or (Op SHR (8-X))
улови аналогию.ch1=(ch1<<3)^(ch1>>5);
It's a long way to the top if you wanna rock'n'roll