Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2012, 12:31   #1
Tomogochi
Пользователь
 
Аватар для Tomogochi
 
Регистрация: 08.06.2009
Сообщений: 15
По умолчанию XOR для текста и бинарного потока (Delphi)

Добрый день! Пишу программу, выполняющую шифрование методом скремблирования. И возник вопрос-как сложить текстовую строку и бинарную последовательность? Оператор XOR автоматически переведет буквы в бинарное представление? Или мне это надо сделать это с каждой буквой вручную?
Например, у меня есть текст "мама мыла раму" и последовательность 0011010101. И мне надо сделать для них XOR.
Tomogochi вне форума Ответить с цитированием
Старый 18.05.2012, 17:26   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Текст нужно рассматривать как последовательность байтов. Или, если хотите, информацию в бинарном виде.
Кстати, Ваша последовательность в какой системе счисления записана?
s-andriano вне форума Ответить с цитированием
Старый 18.05.2012, 19:18   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.programmersforum.ru/showt...ight=XORString
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.05.2012, 19:51   #4
Tomogochi
Пользователь
 
Аватар для Tomogochi
 
Регистрация: 08.06.2009
Сообщений: 15
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Кстати, Ваша последовательность в какой системе счисления записана?
Последовательность бинарная.Любой длины. Я её потом циклически добью до длины самого текста.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Скажите, а что делает функция byte(str[i])? Тип byte знаю, а вот функцию нет...

Последний раз редактировалось Stilet; 18.05.2012 в 21:16.
Tomogochi вне форума Ответить с цитированием
Старый 18.05.2012, 21:08   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Tomogochi Посмотреть сообщение
Последовательность бинарная.Любой длины. Я её потом циклически добью до длины самого текста.
Ее нужно добить до длины (в битах) в 8 раз превосходящих длину текста (если мы используем однобайтовую кодировку и в 16 раз в случае юникода), и перевести в байты. При этом у текста и последовальности будет одинаковая длина.
Цитата:
Сообщение от Tomogochi Посмотреть сообщение
Скажите, а что делает функция byte(str[i])? Тип byte знаю, а вот функцию нет...
Это не функция, это приведение типа.
Подозреваю, Вы бы это назвали "переводом в бинарное представление".
Т.е. тип символа переводится в тип байта.
s-andriano вне форума Ответить с цитированием
Старый 18.05.2012, 21:18   #6
Tomogochi
Пользователь
 
Аватар для Tomogochi
 
Регистрация: 08.06.2009
Сообщений: 15
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Ее нужно добить до длины (в битах) в 8 раз превосходящих длину текста (если мы используем однобайтовую кодировку и в 16 раз в случае юникода)
Ну, мне юникод не нужен ,потому что там "закорючки" получаются ,если их вывести на экран. Использовала тип AnsiString в программе, вроде
бы, нормальные символы получаются..

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Подозреваю, Вы бы это назвали "переводом в бинарное представление".
Т.е. тип символа переводится в тип байта.
Понятно. Я коряво пишу, наверное. Под бинарным я имела ввиду, что последовательность состоит из 0 и 1.
Tomogochi вне форума Ответить с цитированием
Старый 18.05.2012, 21:32   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Под бинарным я имела ввиду, что последовательность состоит из 0 и 1.
Поверь мне - тебе эта последовательность не нужна.
Атом данных - байт. Вот и работай с байтами (как в моем примере)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.05.2012, 21:41   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Так и есть. Важно только понимать, что именно мы подразумеваем под "0" и "1" в каждом конкретном случае.
А вариантов явно больше одного:
1. Бит - элементарная единица информации, может принимать только два значения, которые и считаются нулем и единицей. В байте 8 битов.
2. Число. Обычно состоит из некоторого количества битов, обычно, 8, 16, 32 или 64. Кроме 0 и 1 может принимать другие значения.
3. Символ. Обычно представляется байтом, содержащим код символа. Коды символов "0" и "1" равны 48 и 49 соответственно.
В Вашей задаче подразумевается 1-й вариант. Но человеку с информацией в таком виде работать очень неудобно, поэтому используются и другие варианты.
Указанная Вами в первом посте последовательность записывается посредством 10 символов, т.е. ее текстовая запись имеет длину 10 байт, но в двоичном представлении она соответствует 10 битам, т.е. 1.25 байта.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Поверь мне - тебе эта последовательность не нужна.
Атом данных - байт. Вот и работай с байтами (как в моем примере)
Неочевидно.
Во-первых, "атом" данный все-таки бит. А байт - лишь минимальная адресуемая единица, да и то лишь на архитектуре Intel, на многих других процессорах минимально адресуемая единица информации - четырехбайтовое слово.
Во вторых, в первом посте указана последовательность из 10 бит. Как-то нацело она на 8 не делится.

Последний раз редактировалось Stilet; 18.05.2012 в 22:11.
s-andriano вне форума Ответить с цитированием
Старый 18.05.2012, 22:13   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Во-первых, "атом" данный все-таки бит.
В ЯП атомом является байт.
Цитата:
в первом посте указана последовательность из 10 бит.
Допускаю что автор не смогля правильно выразить свои мысли. Всего-то...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.05.2012, 22:13   #10
Tomogochi
Пользователь
 
Аватар для Tomogochi
 
Регистрация: 08.06.2009
Сообщений: 15
По умолчанию

Мужчины, вы меня запутали совсем! От задания ушла я совсем далеко...
Написала, ошибок при компилировании нет, но не работает. Выскакивает окошко с ошибкой " '-' is not a valid integer value"

Код:
var
  Form1: TForm1;
  text, key, longkey, toto, ItStr, DvoichStr: string;
  ShifrSimvol:integer;
implementation

{$R *.dfm}

Function BinToDec(Value:String):String;  // перевод из двоичной в десятичную
Var
i:SmallInt;//тип SmallInt это целое число от -32768 до 32767
DecValue:Integer;
Digit:String[2];
Begin
Digit:='01';
DecValue:=0;
For i:=1 To Length(Value) Do
DecValue:=DecValue*2+Pos(Value[i],Digit)-1;
Result:=IntToStr(DecValue);
End;

Function DecToBin(Int:Integer):String;  // перевод десятичного представлния в двоичное
Var
StringConst:String[2];
Begin
StringConst:='01';
Result:='';//Обнуляем результат функции
Repeat
//Если Int Mod 2 = 0(т.е. остаток 0) пишем первый элемент,
//Если Int Mod 2 = 1, то второй пишем элемент
Result:=StringConst[(Int Mod 2)+1] + Result;
Int:=Int Div 2;//Делим десятичное число на 2
Until Int=0;
End;

Function StrToBin(TextValue:String):String;  //перевод строки в битовое представление
Var
TempString:String;
OctString:String;
BinString:String;
i,k:SmallInt;
Begin
For i:=1 To Length(TextValue) Do Begin
TempString:=DecToBin(Ord(TextValue[i]));//переводим i-й элемент в
//двоичную систему и присваиваем его TempString
OctString:='';
If Length(TempString)<8 Then Begin//если длина TempString<8
For k:=1 To 8-Length(TempString) Do Begin//то создаем строку
OctString:=OctString+'0';//длиной 8-Length(TempString) состоящую из
//нулей
End;
End;
TempString:=OctString+TempString;//дополняем нулями TempSting
BinString:=BinString+TempString;
Result:=BinString;
End;
End;


procedure TForm1.Button2Click(Sender: TObject);
var i, j, k, m:integer;
Cha: char;
Simv: integer;
SimvStr,Simvol,Shifr, ShifrSimv, ShifrText: string;
begin
Text:=Memo1.Text;
key:=Edit1.Text;
for i:=1 to Length(Text) do   // перевод строки в числовую строку
  begin
  Cha:=(Text[i]);
  Simv:=Ord(Cha);
  Simvol:=IntToStr(Simv);
  SimvStr:=SimvStr + Simvol; // получили строку из чисел
  end;


DvoichStr:=StrToBin(SimvStr);     // применяем процедуру перевода строки чисел в строку 0 и 1

  for k := 1 to (length(DvoichStr) div length(key)) do
  longkey := longkey + key;    // увеличиваем длину ключа до длины строки

  for j:=1 to Length(DvoichStr) do   // сложение по модулю 2 строки 0и1 и ключа
   begin
   toto:=IntToStr((StrToInt(DvoichStr[j]) xor StrToInt(longkey[j])));
   ItStr:=ItStr + toto;
   end;

  Shifr:=BinToDec(ItStr); // процедурой BinToDec переводим из строки 0и1 в десятичное

  for m:=1 to Length(Shifr) do
   begin
   ShifrSimvol:=StrToInt(Shifr[m]);
   ShifrSimv:= Chr(ShifrSimvol);
   ShifrText:=ShifrText + ShifrSimv;
   end;

  Memo2.Text:=ShifrText;

end;
end.
Tomogochi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C#] Изменение текста label1 из другого потока/класса GregRUS Помощь студентам 3 11.01.2012 09:24
xor текста из Memo riderpro Общие вопросы Delphi 10 09.01.2012 22:33
Поиск текста в массиве Char, массив берётся у бинарного файла(exe, dll) Человек_Борща Общие вопросы Delphi 13 08.10.2011 20:06
метод XOR для графики Valuh Помощь студентам 0 30.09.2011 16:46
xor шифрование (delphi) CAMOBAP Помощь студентам 16 11.01.2011 00:02