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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2009, 11:17   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Поясни, пожалуйста со скобками в преобразовании типов. я чёт запутался
1. Очередной Символ из Мемо принимается как беззнаковое целое - (unsigned int)Memo1->Text[i]

2. К полученному числу прибавляется смещение К (ключ шифра) и вычисления

3. полученое число обратно расценивается как символ - char(((unsigned int)Memo1->Text[i]+k)%223 + 32)

Аналог:
Код:
int m=(unsigned int)Memo1->Text[i]
 m+=k
 m=m%223+23
char c=(char)m
Примерно так.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 13:05   #12
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

проблема: в билдере этим алгоритмом не шифруется буква 'я'
Dimarik вне форума Ответить с цитированием
Старый 27.08.2009, 13:14   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не шифруется буква 'я'
Наверное потому что она последняя в списке. Просто исключи ее из шифра, все равно на фоне 99% остального зашифрованного она не будет заметна
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 14:04   #14
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

значит так. попробую понормальнее объяснить свою проблему. первоначально я шифровал гораздо проще, без всяких операций деления по модулю. и шифровка (увеличение кодов символов) прохидила не с числом, записанным в программе, а с числовм, введённым с клавиатуры. в итоге у меня получалась таккая картина6 иногда шифровка и дешифровка проходит нормально, а иногда, я , имея первоначально, допустим, 223 символа незашифрованного текста, в зашифрованном получаю уже 114 символов. это говорит о том, что на каком-то моменте попался символ, который не был напечатан или символ конца файла или ещё что-то. именно из-за этой проблемы в самом начале моей темы я привёл текст программы, которую написал для отображения всех символов ASCII.
может быть можно и без операции деления по модулю было обойтись, не знаю, так как окончательно эту проблему я не понял. Модет кто подскажет?
ну вот я написал два цикла соответственно шифровки и дешифровки:
Код:
   for(i=1;i<n+1;i++)
        {

                a[i]=char(((unsigned int)a[i]+1)%254 + 32);
        };

for(i=1;i<n+1;i++)
        {
                a[i]=(unsigned int)a[i]-32;
                a[i]=char((a[i]-1)%254);
        };
в итоге получается какая-то ерунда.

Последний раз редактировалось MaTBeu; 27.08.2009 в 17:37.
Dimarik вне форума Ответить с цитированием
Старый 27.08.2009, 15:03   #15
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Наверное потому что она последняя в списке. Просто исключи ее из шифра, все равно на фоне 99% остального зашифрованного она не будет заметна
Ну вот, теперь все знают зацепку к расшифровке кода Dimarik-а. :)
ds.Dante вне форума Ответить с цитированием
Старый 27.08.2009, 15:19   #16
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

или же надо брать деление по модулю 223....
короче не знаю... I need help
Dimarik вне форума Ответить с цитированием
Старый 27.08.2009, 15:47   #17
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот на такой вариант взгляните. Отнимает от кода символа 30. Если полученное значение меньше 32, то оно отнимается от 256.

Шифрование:
Код:
unsigned char *a;
int n = Memo1->Text.Length();
a = new unsigned char[n+1];
int i,tmp;
strcpy(a,Memo1->Text.c_str());
for(i=0; i<n; i++)
 {
  tmp = (int)a[i] - 30;
  if(tmp<32) tmp = 256-tmp;
  a[i] = (char)tmp;
 }

Memo2->Text = (char*)a;
delete[] a;
Дешифрация:

Код:
int i;
unsigned char *a;
int n = Memo2->Text.Length();

a = new unsigned char[n+1];

strcpy(a,Memo2->Text.c_str());

int tmp;
for(i=0; i<n; i++)
 {
  tmp = (int)a[i];
  if(tmp>224)
   tmp = 256-tmp;
  tmp += 30;
  a[i] = (unsigned char)tmp;
  }

Memo1->Text = (char*)a;
delete[] a;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 27.08.2009, 17:00   #18
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а кто-нибудь может ответить на мой вопрос: почему когда я без всяких условий циклом писал a[i]+=5 и аналогично в дешифровке вычитал, у меня ингода вместо 454 символов получалось 111 зашифрованных и соответственно ничего уже не расшифровывалось?
Dimarik вне форума Ответить с цитированием
Старый 27.08.2009, 17:07   #19
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Мог получиться нулевой символ или еще какой управляющий, в итоге записывалось не то, что ожидалось. Поэтому в данном случае нужно работать с файлами как с бинарными, а не текстовыми
pu4koff вне форума Ответить с цитированием
Старый 27.08.2009, 17:21   #20
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Код:
for(i=1;i<n+1;i++)
        {

                if (tmp<32) tmp=256-tmp;
                tmp=(int)a[i]-30;
                a[i]=(unsigned char)tmp;
        };
дешифровка:
Код:
for(i=1;i<n+1;i++)
        {
                tmp=(int)a[i];
                if (tmp>224) tmp=256-tmp;
                tmp+=30;
                a[i]=(unsigned char)tmp;

        };
всё нормально работает, но почему-то перед каждой открыыающей скобкой появляется +
Dimarik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ascii код dollemika Помощь студентам 2 29.04.2009 20:07
ASCII коды Strogg Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 03.04.2009 17:09
paskal ascii netcher Помощь студентам 1 03.03.2009 12:45
ASCII в ANSI JRcoker Общие вопросы Delphi 5 03.08.2008 15:49
Перекодировка из ASCII Dimo444ka Помощь студентам 2 25.05.2008 13:22