Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с программой, шифрующей текст в иероглифы 
:(
    Опции темы
gif0
  Дата 7.2.2010, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 6.11.2009

Репутация: нет
Всего: нет



Я написал программу, которая шифрует текст в иероглифы (работаю с юникодом). Но возникла проблема. После того как я зашифровал, а потом дешифровал текст, в Memo этот текст отображается с новыми переносами строки. Не буду многословным, смотрите скрины.

Первоначальное состояние текста:
user posted image

После шифрования и дешифрования:
user posted image

Пожалуйста, помогите решить эту проблему.

Вот исходник класса, который занимается шифрованием/дешифрованием:

Код

class Cryptographer {
    public:
        static void Encryption(TStringList * list, UnicodeString key) {
            if (key == "") {
                return;
            }
            UnicodeString str;
            for (int i = 0; i < list->Count; i++) {
                str = list->Strings[i];
                for (int j = 1, k = key.Length(); j <= list->Strings[i].Length(); j++, k--) {
                    if (k == 0)
                    {
                        k = key.Length();
                    }
                    wchar_t symbol = int(str[j]) + int(key[k]);
                    str[j] = symbol;
                }
                list->Strings[i] = str;
            }
        }
        static void Decoding(TStringList *list, UnicodeString key) {
            if (key == "") {
                return;
            }
            UnicodeString str;
            for (int i = 0; i < list->Count; i++) {
                str = list->Strings[i];
                for (int j = 1, k = key.Length(); j <= list->Strings[i].Length(); j++, k--) {
                    if (k == 0)
                    {
                        k = key.Length();
                    }
                    wchar_t symbol = int(str[j]) - int(key[k]);
                    str[j] = symbol;
                }
                list->Strings[i] = str;
            }
        }
};


Вот функция, которая работает с этим классом:

Код

void TMainForm::EncryptOrDecrypt(int my_switch)
{
    if (my_switch != 0 && my_switch != 1) {
        return;
    }
    TStringList * list = new TStringList;
    list->AddStrings(MainMemo->Lines);
    wchar_t str[]={29408,30400,0};
    UnicodeString pass = str;

    if (my_switch == 0) {
        Cryptographer::Encryption(list, pass);
    }
    else {
        Cryptographer::Decoding(list, pass);
    }

    MainMemo->Clear();
    MainMemo->Lines->AddStrings(list);
    delete list;
}


Это сообщение отредактировал(а) gif0 - 7.2.2010, 06:47
PM MAIL   Вверх
vikaz
Дата 7.2.2010, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Еще не разобрался? Тебя не смутило, что количество символов в строке получается одинаковым?
Все из-за того,что ты при шифровании оперируешь сначала строками а потом символами, а не сразу символами.  Когда ты зашифровал строку, то у тебя в MainMemo может отобразиться только определенное число иероглифов, посчитай их, и ты увидишь, что их число = числу символов в строке после декодирования! smile Выход - читать не построчно, а посимвольно! 

P.S. Этот косяк так же возник и за Memo. У этой компоненты не очень хорошее свойство, самостоятельно устанавливать переносы по своей видимой части (свойство WordWrap = true), но, если это свойство будет = false, то форматирование проводиться не будет и весь текст можешь не увидеть. Попробуй посимвольно, но что-то я не уверен, что это поможет. :(

Это сообщение отредактировал(а) vikaz - 7.2.2010, 09:37


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 7.2.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Вот примерный код, как должны выглядеть функции. Но есть и проблемы при декодировании появляются лишние символы:  ДОДЕЛАЛ!
Код

void Cryptographer::Encryption(TStringList * list, UnicodeString key)
{
 if (key == "") return;
 UnicodeString str = list->Text;
 for (int j = 1, k = key.Length(); j < str.Length()-1; j++, k--)
 {
  if (k == 0) k = key.Length();
  wchar_t symbol = int(str[j]) + int(key[k]);
  str[j] = symbol;
 }
 list->Text = str;
};
//---------------------------------------------------------------------------
void Cryptographer::Decoding(TStringList *list, UnicodeString key)
{
 if (key == "") return;
 UnicodeString str = list->Text;
 for (int j = 1, k = key.Length(); j < str.Length()-1; j++, k--)
 {
  if (k == 0) k = key.Length();
  wchar_t symbol = int(str[j]) - int(key[k]);
  str[j] = symbol;
 }
 list->Text = str;
}

Вот код вызова:
Код

list = new TStringList;
    list->Text = MainMemo->Text;

    wchar_t str[]={29408,30400,0};
    UnicodeString pass = str;
    if (Encoding->Checked) {

        Cryptographer qwe;
        qwe.Encryption(list, pass);
    }
    else {
        Cryptographer qwe1;
        qwe1.Decoding(list, pass);
    }

    MainMemo->Clear();
    MainMemo->Lines->AddStrings(list);

инициализацию list вынес:
Код

...
    TRadioButton *decoding;
    void __fastcall Button1Click(TObject *Sender);
private: TStringList * list;
public:        // User declarations
    __fastcall TForm2(TComponent* Owner);
...

В Атаче находится изображение, как это работает! 

Это сообщение отредактировал(а) vikaz - 7.2.2010, 12:13

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  ________________.jpg 378,92 Kb


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 7.2.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



ЗЫ. Еще одним возможным решением проблемы, не хранить конвертируемый текст в Memo, т.е. в Memo только выводить, а все данные хранить в переменной.
Работающий код ВЫШЕ!

Это сообщение отредактировал(а) vikaz - 7.2.2010, 12:13


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
gif0
Дата 7.2.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 6.11.2009

Репутация: нет
Всего: нет



Спасибо большое! Если бы не ты, не знаю сколько мне пришлось бы заниматься отладкой этой программы  smile 

Но мне кое-что не понятно. Почему у тебя в цикле, который занимается шифрованием, условие выхода такое:
Код

j < str.Length() - 1


Разве оно не должно быть таким?
Код

j <= str.Length()

PM MAIL   Вверх
vikaz
Дата 7.2.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Цитата(gif0 @  7.2.2010,  15:41 Найти цитируемый пост)
j <= str.Length()

Если честно, времени много на отладку не было! Просто в конце появлялись лишние 2 символа! Поэтому на 2 и уменьшил. Откуда они взялись, я так еще и не понял, времени на это не было! smile



--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.