|
#1
|
|||
|
|||
перестановка бит
здравствуйте. горит вопрос. необходимо реализовать прогу, в которую можно загрузить файл (любой) и работать с его двоичным кодом (перестановки бит и т.д.). это из криптографии. ничего полезного не нашел на форумах пока
|
#2
|
||||
|
||||
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
vankai14 (15.04.2014)
|
#3
|
|||
|
|||
Цитата:
спасибо, а примерно несколько строк набросать что и как сделать можете? что бы я уже дальше справку почитал |
#4
|
||||
|
||||
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject); var fs: TFileStream; buf: PByteArray; i: Integer; begin fs := TFileStream.Create('Имя открываемого файла', fmOpenReadWrite); try fs.Position := 123; // Устанавливаем позицию с которой нужно прочитать GetMem(buf, 10); // Резервируем память под буфер на 10 байт try fs.ReadBuffer(buf^, 10); // Читаем 10 байт из указанной позиции файла в буфер for i := 0 to 9 do // Что нибудь делаем с этими 10 байтами: begin buf^[i] := buf^[i] xor $AA; end; fs.Position := 123; // Устанавливаем позицию с которой нужно записать fs.WriteBuffer(buf^, 10); // Записываем изменённые 10 байт назад в файл finally FreeMem(buf); // Освобождаем память занимаемую буфером end; finally fs.Free; end; end; |
#5
|
|||
|
|||
Цитата:
а именно с БИТАМИ, а не байтами? |
#6
|
||||
|
||||
Цитата:
Код:
and, or, xor, not, shl, shr |
#7
|
|||
|
|||
Цитата:
перемешивать надо не байты, а биты. как-то создать массив можно с битами и работать с ними? |
#8
|
||||
|
||||
Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 15.04.2014 в 12:43. |
#9
|
|||
|
|||
Цитата:
Спасибо, а пример кода можете набросать? |
#10
|
||||
|
||||
Цитата:
Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#11
|
|||
|
|||
я почитал справку. эти операторы только сдвигают биты влево/вправо, так ? а мне нужно именно перемешать. например 1ый поставить вместо 62 или 45ый вместо 4ого и т.д.
|
#12
|
||||
|
||||
Цитата:
|
#13
|
|||
|
|||
Например так:
Биты нумеруются справа с 0 по 31 Код:
function GetBit(Source : Cardinal; Position:Integer):Cardinal; begin Result := (Source shr Position) and 1; end; function GetNBit(Source : Cardinal; Position:Integer;Count:Integer):Cardinal; begin Result := (Source shl ( 31 - Position ));(* сдвигаем в лево, что бы ушли лишние старшие разряды *) Result := Result shr( 31 - Position - Count -1 );(* сдвигаем в право, что бы ушли лишние младшие разряды *) end; procedure SetBit(var Source : Cardinal; Position:Integer; Bit:Byte); begin Mask:=1 shl Position; Source := Source and not (1 shl Position); // обнуляем битик Source := Source or ((Bit and 1) shl Position; // Записываем битик end; procedure SetNBit(var Source : Cardinal; Position,Count:Integer; Value:Cardinal); var MaskP: Cardinal; MaskN: Cardinal; begin Value := Value shl (Position - Count -1); MaskP := ((not 0) shl (32 - Count))shr (31 - Position); MaskN:=not MaskP; Source := (Source and MaskN) or (Value And maskP); end; |