Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генератор Паролей 
V
    Опции темы
SeventhSon
Дата 3.7.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!

Пишу генератор паролей (см. коменты в коде):
Код

//Событие нажатия на кнопку Сгенерировать.
        private void buttonGener_Click(object sender, EventArgs e)
        {
            //Если параметр количества символов не введен -
            // - пользователь получает сообщение-предупреждение.
            if (textBoxSymb.Text == "")
            {
                MessageBox.Show("Введите параметры пароля!");
            }
            //Если введен - идет выполнение кода генерации пароля.
            else
            {
                //Количество символов, которые хочет получить в пароле юзер сохраняем в строке s
                //и переводим строковую пременную в цифры (перменную sym) с помощью конвертации.
                string s = textBoxSymb.Text;
                int sym = Convert.ToInt32(s);

                //Создаем массив, в который закинем все символы из которых будет генерироваться
                //пароль (цифры, маленькие и большие лат. буквы).
                char[] all;
                all = new char[73];

                //Заполняем массив сперва цифрами. 
                //ASCII-коды цифр находятся в диапазоне от 48 до 58.
                //Первые 10 элементов массива заполняются цифрами.
                for (int i = 0; i < 10; i++)
                {
                    for (int a = 48; a < 58; a++)
                    {
                        all[i] = Convert.ToChar(a);//Конвертируем в тип, кот имеет масси(char).
                    }
                }

                //Заполняем массив маленькими лат. буквами.
                //Коды 97 — 123 как-раз соответствуют латинским символам нижнего регистра.
                //26 следующих элементов массива (с 10 по 36) получают маленькие буквы.
                for (int i = 10; i < 36; i++)
                {
                    for (int a = 97; a < 123; a++)
                    {
                        all[i] = Convert.ToChar(a);////Конвертируем в тип, кот имеет массив(char).
                    }
                }

                //Заполняем массив большими лат. буквами.
                //Коды латинских символов верхнего регистра — от 65 до 91.
                //36 следующих элементов массива (с 36 по 72) получают большие лат. буквы.
                for (int i = 36; i < 72; i++)
                {
                    for (int a = 65; a < 91; a++)
                    {
                        all[i] = Convert.ToChar(a);////Конвертируем в тип, кот имеет массив(char).
                    }
                }
                
                //Обнуляем текстбокс в который будет выведен готовый пароль.
                textBoxTotal.Text = "";

                //Создаем массив, в котором и будет готовый пароль.
                //Длина определена с помощью переменной sym, кот определил юзер в текстбоксСим.
                char[] pass;
                pass=new char[sym];

                //Генерируем рандомное число.
                Random rnd = new Random();

                //Заполняем массив с готовым паролем.
                for (int i=0; i<sym; i++)
                {
                    //Приказываем вернуть рандомное число 0-72 (по кол-ву символов в массиве all).
                    rnd.Next(0,72);
                    //Переменная а получает число, которое надо искать в массиве all.
                    int a = Convert.ToInt32(rnd);

                    //Каждый элемент массива с готовым паролем получает элемент под номером,
                    //который будет дан рандомно из массива со всеми символами.
                    pass[i] = all[a];
                }

                //Заполняем выходнйой текстбокс массивом с готовым паролем.
                textBoxTotal.Text = pass.ToString();                                      
            }
        }


Ошибок нет. Все компилируется. Ввожу желаемую длину. Нажимаю на кнопку "Сгенерировать" и получаю предупреждение о необработаном исключении. Ну и программа ничего не делает и виснет. Где и в чем ошибка?
Спасибо!
PM MAIL   Вверх
Partizan
Дата 3.7.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Цитата

Где и в чем ошибка?


Информация об этом содержится в Details/Inner Exception исключения, а также в прилагаемом Call-stack-е


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
DVariuS
Дата 3.7.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



SeventhSon, ну для начала, в 73-й строке ошибка - замени 71-ю и 73-ю на
Код

int a = rnd.Next(0, 72);

PM MAIL   Вверх
SeventhSon
Дата 3.7.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Валер, я изменил как ты порекомендовал. В итоге получается так: я ввожу длину пароля, нажимаю на кнопку, в текстбоксе для вывода, вместо пароля,  появляется "System.Char[]".
PM MAIL   Вверх
Partizan
Дата 3.7.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



SeventhSon, ну потому что надо из массива char сначала получить string, а потом устанавливать текстом в текстбокс


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
SeventhSon
Дата 4.7.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как это реализовать?

Вот это не катит  smile :
Код

                //Создаем строку и заполняем её элементами массива предварительно конвертировав.
                string password = Convert.ToString(pass);

                //Заполняем выходнйой текстбокс массивом с готовым паролем.
                textBoxTotal.Text = password;   


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


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



SeventhSon, string password = new String(pass);


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Lunatic2009
Дата 5.7.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Код

string s = textBoxSymb.Text;
int sym = Convert.ToInt32(s);



тут не помешает блок try catch, т.к если Вы ввели не число, будет исключение...
PM   Вверх
mr.Anderson
Дата 11.7.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Покороче и более корректно.
Код

try
{
    string s = int.Parse(textBoxSymb.Text);
}
catch
{
    MessageBox.Show("Invalid typecast.");
}



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

user posted image
PM MAIL ICQ Skype   Вверх
SeventhSon
Дата 14.7.2009, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, парни. Я пока не могу попробовать, моник в ремонте. Как только, так сразу.
PM MAIL   Вверх
SeventhSon
Дата 9.8.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Partizan, что-то не получается... Куда это вставлять? Может, я просто не так делаю...
PM MAIL   Вверх
mr.Anderson
Дата 9.8.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



SeventhSon, у тебя есть фрагмент:
Код

//Создаем строку и заполняем её элементами массива предварительно конвертировав.
string password = Convert.ToString(pass);

Partizan имел в ввиду немного другой вариант:
Код

//поправить
string password = new String(pass);



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

user posted image
PM MAIL ICQ Skype   Вверх
diadiavova
Дата 9.8.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(SeventhSon @  9.8.2009,  14:49 Найти цитируемый пост)
Может, я просто не так делаю... 

 smile 
Во-первых, если тебе надо предоставить пользователю возможность определять количество символов, то текстбокс для этого не очень подходит, а между тем существует отличный контрол NumericUpDown, предназначенный примерно для таких целей.
Во-вторых, логику формирования набора символов, из которых должен состоять пароль следует отделить от логики генерации самого пароля. На то есть множество причин, в частности: пароли в разных местах могут состоять из разных наборов символов. Если задача требует, чтобы набор символов был фиксированным, то этот набор вообще лучше всего сохранить в виде константы, а не генерировать каждый раз один и тот же набор при генерации пароля.

Код

        const string symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        string generatePassword(int count)
        {
            if (count < 1)throw new ArgumentException("Количество символов должно быть положительным") ;
            var sb = new System.Text.StringBuilder();
            var rnd = new Random();
            for (int i = 0; i < count; i++)
            {
                sb.Append(symbols[rnd.Next(0, symbols.Length - 1)]);
            }
            return sb.ToString();
        }

Дальше вызываешь эту функцию, передаёшь ей количество символов (взятое из нумерикапдаун) и вуаля smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Crypton
Дата 9.8.2009, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

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



Ну тем, кто хочет вводить данные не с numericupdown, можно тупо заюзать int.TryParse

Код

int a = -1;

if(!int.TryParse(txtPassLength.Text, out a)) {
  MessageBox.Show("Пожалуйста введите числовое значение");
  return;
}

// едем далее


--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
SeventhSon
Дата 10.8.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо! Особенно, diadiavova!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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