Dur le c# !

Résolu
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 - 30 juin 2010 à 11:00
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 - 6 juil. 2010 à 13:55
Pour commencé Bonjour a tous !!

Alors, bon je viens tous juste de commencer le c# pour un petit projet d'école et je dois avouer que je rame un peu la :D !
Bref en gros le but est de faire une calculatrice IP.
Donc j'ai commencer avec mes petits doigts et beaucoup de chose que je vois ici et là mais la je sature je ne trouve pas !

voici mon code :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
// Convertir la String en Int
String M1 = this.M1.Text;
int M11 = Convert.ToInt32(M1);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (M11 <= 255 && M11 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");
}

// Debut conversion Decimal Binaire
public static string convDecBin(int dec)
{


string res = M11;
int div;
int i;


do
{

div = 0;
i = dec;

while (i != 1 && i != 0)
{
i -= 2;
div += 1;
}

res = Convert.ToString(dec - (2 * div)) + res;
dec = div;

}
while (dec != 0);

M2.Text = res; //c'était juste pour voir si ça marchait ..

Bon vous l'avez compris je suis pas très doué... La où je coince c'est a la conversion , j'ai essayé tous plein de chose et de technique mais rien n'y fais ça ne marche pas ! Je pense que le problème viens surtout que je n'ai pas compris toutes les base du C#.
Enfin bref , avec ceci j'avais réussi a avoir quelques chose :
"string resultat = string.Format("{0} en binaire ça donne {1}", M11, Convert.ToString(M11, 2));"
mais le soucis c'est que j'aimerais simplement récupérer la valeur binaire pour m'en servir après pour les autre calcul et conversion que j'aurais.
Voila j'espère que j'ai réussi a me faire comprendre et que vous pourrez me donnez quelques astuces.
Merci d'avance.

6 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
4 juil. 2010 à 19:18
Bonjour

Pour tester une saisie en C# le mieux est sans doute d'utiliser les expressions régulières
pour une adresse IP on peut utiliser IPAdresse.Parse(...).

exemples:
using System;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace IpAdress1
{
public partial class Form1 : Form
{
/// <summary>
/// recharche 4 groupes de decimal, chaque groupe max 3 digits, séparés par des '.'
/// </summary>
public Regex MyRegex = new Regex("(?:^)(?<one>\\d{1,3})\\x2E(?<two>\\d{1,3})\\x2E(?<three>\\d{1,3})\\x2E(?<four>\\d{1,3})(?:$)",
RegexOptions.ExplicitCapture | RegexOptions.CultureInvariant | RegexOptions.Compiled );

public Form1()
{
InitializeComponent();
button1.Enabled = false;
}

private void button1_Click(object sender, EventArgs e)
{
//test l'adresse saisie en utilisant IPAdress.Parse(...)
//En cas d'erreur on a une exception
try
{
IPAddress test = IPAddress.Parse(textBox1.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
//test à la volé, dès que c'est bon on affiche le bouton
button1.Enabled = IsIpValid(textBox1.Text);
}
//test via une expression régulière
//l'avantage par rapport à IPAdresse.Parse(...) est d'avoir plus de détail sur l'erreur de saisie
bool IsIpValid(string text)
{
Match m = MyRegex.Match(textBox1.Text);
if (!m.Success) //ne correspond pas à un masque de 4 groupes de digits séparés par des points
return false;
else if (int.Parse(m.Groups["one"].Value) > 255) // erreur sur le premier groupe
return false;
else if (int.Parse(m.Groups["two"].Value) > 255)
return false;
else if (int.Parse(m.Groups["three"].Value) > 255)
return false;
else if (int.Parse(m.Groups["four"].Value) > 255)
return false;

return true;
}
}
}



C# is amazing, enjoy it!
3
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
1 juil. 2010 à 09:49
Bonjour,

Je ne comprend pas trop ta question car il n'y a pas de distinction en valeur binaire, valeur hexa, valeur décimale au niveau machine: un nombre est un nombre.
Tu peux avoir une distinction à l'affichage comme tu le dis via la méthode Convert.ToString(int, int).

Cependant, si par calcul, tu entends les calculs réseaux (masque, adresse de broadcast, etc...), tu trouveras ton bonheur en passant par la classe IPAdress qui te permettra de manipuler plus aisément tes IPs.
Un exemple: http://convert.codes-sources.com/code2cs.aspx?ID=38956.

Pour le reste des calculs, tu pourras trouver ton bonheur en passant par les opérateurs logiques: OR, AND, XOR, etc...

Voila tout,

Bon développement,

Billou_13

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
1 juil. 2010 à 23:43
Salut billou ! Merci pour ta réponse !! Alors je ne connaissais pas IPAdress, je vais m'y intéressé !
J'ai réussi dans la journée a avancé un peu ce que je voulais, le code est long (pas de méthode pour les conversion), répétitif et pas très pro mais pour le début ça marche ... J'entre une IP et un masque en 4 segments, chaque segment est convertit en binaire et après je passe a la partie calcul !
J'ai regardé ca : http://convert.codes-sources.com/code2cs.aspx?ID=38956. Sur le peux que je comprend, il prend directement l'adress machine, moi j'aimerais entrer tous cela a la main dans une calculette. Si tu veux la ou je reste coincé, c'est que quand je fais un & logique entre mon masque et mon ip pour déterminer le subnet, il me fais bien le calcul et la re-conversion en décimal, mais avec des valeur erronée du style pour : 11111111 & 11000000 = 10586304 .... Donc y'a un soucis, vu que j'ai mit en int c'est surement un problème de classe mais dans ce cas je les convertis en quoi et comment ? Si tu sais m'indiqué pendant que je m'intéresse aux méthode et que je regarde IPAdress, ça serais vraiment sympa ! Je sais qu'aider ceux qui pige rien ca doit être embêtant :) merci d'avance pour cela !

Voici mon code après ma journée :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
// Convertir la String en Int
String M1 = this.M1.Text;
int M11 = Convert.ToInt32(M1);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (M11 <= 255 && M11 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");

// RAZ text box
string M1b = "";
// Debut conversion Decimal Binaire
M1b = Convert.ToString(M11, 2);

// Convertir la String en Int
String M2 = this.M2.Text;
int M22 = Convert.ToInt32(M2);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (M22 <= 255 && M22 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");

// RAZ text box
string M2b = "";
// Debut conversion Decimal Binaire
M2b = Convert.ToString(M22, 2);

// Convertir la String en Int
String M3 = this.M3.Text;
int M33 = Convert.ToInt32(M3);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (M33 <= 255 && M33 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");

// RAZ text box
string M3b = "";
// Debut conversion Decimal Binaire
M3b = Convert.ToString(M33, 2);

// Convertir la String en Int
String M4 = this.M4.Text;
int M44 = Convert.ToInt32(M4);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (M44 <= 255 && M44 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");

// RAZ text box
string M4b = "";
// Debut conversion Decimal Binaire
M4b = Convert.ToString(M44, 2);

string totalm = M1b + M2b + M3b + M4b;
test.Text = totalm;

// Debut des conversion pour l'IP

// Convertir la String en Int
String IP1 = this.IP1.Text;
int IP11 = Convert.ToInt32(IP1);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (IP11 <= 255 && IP11 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");

// RAZ text box
string IP1b = "";
// Debut conversion Decimal Binaire
IP1b = Convert.ToString(IP11, 2);

// Convertir la String en Int
String IP2 = this.IP2.Text;
int IP22 = Convert.ToInt32(IP2);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (IP22 <= 255 && IP22 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");

// RAZ text box
string IP2b = "";
// Debut conversion Decimal Binaire
IP2b = Convert.ToString(IP22, 2);

// Convertir la String en Int
String IP3 = this.IP3.Text;
int IP33 = Convert.ToInt32(IP3);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (IP33 <= 255 && IP33 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");

// RAZ text box
string IP3b = "";
// Debut conversion Decimal Binaire
IP3b = Convert.ToString(IP33, 2);

// Convertir la String en Int
String IP4 = this.IP4.Text;
int IP44 = Convert.ToInt32(IP4);

// Gestion de saisie : Accepte uniquement les vlaeurs numeriques comprise entre 0 et 255
if (IP44 <= 255 && IP44 >= 0) { }

else
MessageBox.Show("Entrez une Valeur Numerique comprise entre <0 et 255>");

// RAZ text box
string IP4b = "";
// Debut conversion Decimal Binaire
IP4b = Convert.ToString(IP44, 2);

string totalip = IP1b + IP2b + IP3b + IP4b;
test2.Text = totalip;

// Re convertir la reponse de type chaine en int
int M1c = Convert.ToInt32(M1b);
int M2c = Convert.ToInt32(M2b);
int M3c = Convert.ToInt32(M3b);
int M4c = Convert.ToInt32(M4b);

int IP1c = Convert.ToInt32(IP1b);
int IP2c = Convert.ToInt32(IP2b);
int IP3c = Convert.ToInt32(IP3b);
int IP4c = Convert.ToInt32(IP4b);

// Debut des additions Binaires
int sub1c = M1c & IP1c;
int sub2c = M2c & IP2c;
int sub3c = M3c & IP3c;
int sub4c = M4c & IP4c;

// re-balance les subs en string
sub1.Text = Convert.ToString(sub1c);
sub2.Text = Convert.ToString(sub2c);
sub3.Text = Convert.ToString(sub3c);
sub4.Text = Convert.ToString(sub4c);






}
}
}




Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
6 juil. 2010 à 09:14
Merci Robert, j'étudie ton code je te dirais ce qu'il en est.

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
6 juil. 2010 à 09:55
Salut Robert. J'ai testé ton code , j'ai refais un Form1 ect ect , mais quand j'entre une série du style 255.255.255.0 dans le textbox1 le button1 ne passe pas en true et si j'entre une série erronée je n'ai pas d'erreur non plus. J'ai du faire une erreur quelque part ?

Je connaissais pas les expression régulière c'est a l'air sympa , j'ai commencé a lire tous çà.

Je n'ai pas encore compris que signifiait (?:^) et //x2E.

Merci encore pour ton et pour votre aide ! Vous êtes super :)

Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
0
theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
6 juil. 2010 à 13:55
Oki Robert , j'ai capté !!!! J'ai réussi a utiliser ton code ! Me reste plus qu'a faire la même chose pour un deuxième textbox et trouvé comment additionné les 2 avec un &&.


Linux c'est une question de VI ou de MORE !
Si Bill Gates donnait du lait à ses programmeurs, ça ferait peut-être des OS costaud.
0
Rejoignez-nous