2015-07-30 4 views
-1

Я изучаю использование C# на данный момент, и я просто делаю случайные вещи, о которых я думаю, поэтому в основном это «генератор кредитных карт», который, очевидно, не делает реальные номера карт, просто случайный 16-значное число, с CVV и Exp.Номер случайного номера C#

До сих пор, я могу получить его, чтобы напечатать дату Exp, но как для номера кредитной карты, я получаю сообщение об ошибке, которая говорит -

«Не удается преобразовать из долго Int», а также о том, сообщение лучший перегруженный метод.

У меня также есть некоторые проблемы с функцией даты, я могу заставить его сгенерировать 6 чисел в порядке, например, день и год, но если я попытаюсь добавить еще 2 числа, он выплеснет еще 6.

Вот мой код, извините, если это не имеет смысла, как я уже сказал, я новичок в этом :)

Заранее спасибо за любую помощь.

private void button1_Click(object sender, EventArgs e) 
    { 


     Random rnd = new Random(); 
     double cardNumber = rnd.Next(4572000000000000, 4999999999999999); 
     int cvv = rnd.Next(001, 999); 
     int expDay = rnd.Next(1, 30); 
     int expMonth = rnd.Next(1, 12); 
     int expYear = rnd.Next(2011, 2015); 

     textBox1.Text = cardNumber.ToString(); 
     textBox2.Text = cvv.ToString(); 
     textBox3.Text = expDay.ToString() + expMonth.ToString() + expYear.ToString(); 

    } 

Я скажу это снова только, чтобы сделать это ясно, это никоим образом не делает реальные номера кредитных карт, они просто случайно сгенерированных цифры .....

+0

'4572000000000000' слишком большая для ** Int ** – EZI

ответ

2

Random.Next принимает int. Поскольку 4999999999999999 и 4572000000000000 больше, чем int.MaxValue (2147483647), но меньше, чем long.MaxValue (9223372036854775807) они автоматически рассматриваются как показывая, что вы хотите long (как если бы вы положили L на конце), но это не может быть повернут назад в число от -2147483648 и 2147483647. И это было бы не очень полезно для вас, если бы это было возможно.

Вы можете создать серию более коротких номеров и добавить их вместе.

Для большей правдоподобия вы можете произвести меньше номеров, чем нужно для номера вашей кредитной карты (обычно 16, поэтому вы должны произвести 15 номеров, хотя номера карт от 14 цифр до 19 цифр были использованы в прошлое), а затем сделать обратный Luhn для получения окончательного номера, так что у вас будет действительный номер кредитной карты, который прошел проверку Luhn. (Это даже имеет практическое применение, и может быть полезно, чтобы специальный случай был действительным за пределами диапазона, используемым любым реальным эмитентом карт в debug-builds, так что у вас есть номер теста, который обрабатывает большинство вашего кода как действительное число, но на последнем шаге не стоит ничего пытаться покупать).

+0

Спасибо очень много, я сделал вид, как вы сказали, и только что сгенерировал 4 строки случайных чисел, чтобы дать мне 16 цифр и присоединился к ним. У меня нет ни малейшего понятия, как работать с Луном, но, надеюсь, когда-нибудь я буду на таком уровне программирования :) – Nezz

+0

Luhn - не плохое упражнение для кого-то, учащегося программировать. Это контрольная сумма, используемая для кредитных/дебетовых/других банковских карт, чтобы улавливать опечатки перед обработкой: последняя цифра может быть рассчитана из остальной части, поэтому, если это не работает, вероятность того, что пользователь допустил ошибку, и мы можем поймать это до мы пытаемся обработать карту. Помимо практических применений, это довольно просто, но немного сложнее, чем большая часть кода, который просто демонстрирует определенную языковую функцию, поэтому дайте ей понять! ... –

+0

Прочтите первый бит в https://en.wikipedia.org/wiki/Luhn_algorithm и посмотрите, сможете ли вы это сделать. Если вы застряли, посмотрите на код Python в нижней части этой страницы и посмотрите, может ли он служить псевдокодом, чтобы вести вас в вашей версии C#. Затем вы можете изменить свой генератор случайных карт, чтобы либо пообещать только действительные номера (pass Luhn), либо только недопустимые номера (не пропускайте Luhn, поэтому не соответствует реальной карте, эквивалент кредитной карты 555 номера телефона). –

0

Как утверждают другие, проблема в том, что int не работает с большими числами. Как вы говорите, вы просто играете вокруг, а не создаете реальные номера карт, как насчет создания цикла для создания одной цифры, а затем звоните в 16 раз. Каждый раз, когда вы вызываете функцию, вы можете добавить результат в строку и удерживать это значение позже.

Кроме того, я не думаю, что кто-то еще указал на это, но вы используете double как тип номера вашей карты. Это неточный тип данных и здесь не подходит, где вам нужно точное число. значение, которое вы хотите, может быть 1234567891234567, но то, что на самом деле хранится в памяти, составляет 123456789123456.0000000000001.

Random rnd = new Random(); 
string cardNumber = string.Empty; 

for(int i = 0; i < 16; i++) 
{ 
    cardNumber += rnd.Next(0,9).ToString(); 
} 
+0

Большое спасибо, я на самом деле думал об использовании цикла, но не мог понять, как это сделать. – Nezz

0

Это код, я использую в настоящее время, но я хочу взглянуть на петлю, как говорилось выше, это, кажется, гораздо более чистого раствора.

 Random rnd = new Random(); 
     int cardNumber1 = rnd.Next(4572, 4999); 
     int cardNumber2 = rnd.Next(1000, 9999); 
     int cardNumber3 = rnd.Next(1000, 9999); 
     int cardNumber4 = rnd.Next(1000, 9999); 
     int cvv = rnd.Next(100, 999); 
     int expDay = rnd.Next(1, 30); 
     int expMonth = rnd.Next(1, 12); 
     int expYear = rnd.Next(2015, 2019); 

     textBox1.Text = cardNumber1.ToString() + cardNumber2.ToString() + cardNumber3.ToString() + cardNumber4.ToString(); 
     textBox2.Text = cvv.ToString(); 
     textBox3.Text = expDay.ToString() + "/" + expMonth.ToString() + "/" + expYear.ToString(); 
Смежные вопросы