Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.04.2014, 09:35
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
Восклицание перестановка бит

здравствуйте. горит вопрос. необходимо реализовать прогу, в которую можно загрузить файл (любой) и работать с его двоичным кодом (перестановки бит и т.д.). это из криптографии. ничего полезного не нашел на форумах пока
Ответить с цитированием
  #2  
Старый 15.04.2014, 11:31
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vankai14
здравствуйте. горит вопрос. необходимо реализовать прогу, в которую можно загрузить файл (любой) и работать с его двоичным кодом (перестановки бит и т.д.). это из криптографии. ничего полезного не нашел на форумах пока
Для работы с файлом (с его двоичным кодом) удобно использовать класс TFileStream.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
vankai14 (15.04.2014)
  #3  
Старый 15.04.2014, 11:41
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Для работы с файлом (с его двоичным кодом) удобно использовать класс TFileStream.

спасибо, а примерно несколько строк набросать что и как сделать можете? что бы я уже дальше справку почитал
Ответить с цитированием
  #4  
Старый 15.04.2014, 11:54
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vankai14
спасибо, а примерно несколько строк набросать что и как сделать можете? что бы я уже дальше справку почитал
Примерно так:
Код:
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  
Старый 15.04.2014, 11:59
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Примерно так:
Код:
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;


а именно с БИТАМИ, а не байтами?
Ответить с цитированием
  #6  
Старый 15.04.2014, 12:06
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vankai14
а именно с БИТАМИ, а не байтами?
Байт состоит из 8 бит. Для работы с битами используются стандартные логические операторы:
Код:
and, or, xor, not, shl, shr
.
Ответить с цитированием
  #7  
Старый 15.04.2014, 12:20
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Байт состоит из 8 бит. Для работы с битами используются стандартные логические операторы:
Код:
and, or, xor, not, shl, shr
.

перемешивать надо не байты, а биты. как-то создать массив можно с битами и работать с ними?
Ответить с цитированием
  #8  
Старый 15.04.2014, 12:40
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
перемешивать надо не байты, а биты. как-то создать массив можно с битами и работать с ними?
Для этого надо учить матчасть. Ни один из известных мне процессоров не позволяет загрузить один бит из памяти и что-то с ним делать. Минимальная обрабатываемая процессором единица - байт. Всегда, когда говорится про перестановку бит, она производится над частями байт через and, or, xor и т.д.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 15.04.2014 в 12:43.
Ответить с цитированием
  #9  
Старый 15.04.2014, 13:01
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Для этого надо учить матчасть. Ни один из известных мне процессоров не позволяет загрузить один бит из памяти и что-то с ним делать. Минимальная обрабатываемая процессором единица - байт. Всегда, когда говорится про перестановку бит, она производится над частями байт через and, or, xor и т.д.

Спасибо, а пример кода можете набросать?
Ответить с цитированием
  #10  
Старый 15.04.2014, 13:54
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от vankai14
Спасибо, а пример кода можете набросать?
Ну вот же, дали наводку, как из байта вычленить биты:
Цитата:
Сообщение от poli-smen
Байт состоит из 8 бит. Для работы с битами используются стандартные логические операторы:
Код:
and, or, xor, not, shl, shr
.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #11  
Старый 25.04.2014, 11:08
vankai14 vankai14 вне форума
Прохожий
 
Регистрация: 15.04.2014
Сообщения: 24
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

я почитал справку. эти операторы только сдвигают биты влево/вправо, так ? а мне нужно именно перемешать. например 1ый поставить вместо 62 или 45ый вместо 4ого и т.д.
Ответить с цитированием
  #12  
Старый 25.04.2014, 12:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vankai14
я почитал справку. эти операторы только сдвигают биты влево/вправо, так ? а мне нужно именно перемешать. например 1ый поставить вместо 62 или 45ый вместо 4ого и т.д.
С помощью этих операторов можно и перемешивать биты: сначала с помощью and выделяешь перемещаемый бит, потом сдвигаешь его на новое место с помощью shl/shr и наконец присоединяешь его с помощью or в новую позицию, предварительно при необходимости очистив позицию от старого бита с помощью and not.
Ответить с цитированием
  #13  
Старый 25.04.2014, 13:39
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Например так:
Биты нумеруются справа с 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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter