Seek et variable

Résolu
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 - 16 juil. 2007 à 14:37
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 - 18 juil. 2007 à 19:33
Bonjour à tous,

Voilà mon problème, j'aimerais écrire un seek avec une variable dans le genre "fs.Seek(0x + variable, SeekOrigin.Begin)", mais je ne trouve pas la bonne syntaxe pour le faire, quelqu'un serait-il faire ceci? (Je précise que "variable" est un nombre)

Merci

7 réponses

ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
18 juil. 2007 à 10:13
petite correction dans le second code (j'ai taper trop vite désolé)

string MonNombre = MaTextBox.Text.Trim(); //Supprime les espaces
int MonNombreConvertit;
if(MonNombre.StartWith("0x") == true) //Si ta chaine commence par 0x
MonNombreConvertit = Convert.ToInt32(MonNombre.Remove(0, 2), 16); //Supprime le prefixe avant convertion en héxadécimal
else
MonNombreConvertit = Convert.ToInt32(MonNombre[, 10]); //Sinon, on convertit en décimal

J'ai mit le ", 10" entre [ ] car il est optionnel, si tu ne spécifie pas de base, c'est la base 10 (décimal) par défaut.
3
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
16 juil. 2007 à 14:56
Salut !

Pourquoi tu veux ajouter 0x ? Ce préfix ne fait pas parti d'un chiffre, il sert juste à indiquer que le nombre qui le suis est sous sa forme hexadécimale. Par exemple, 14 et 20 sont deux nombres différents, mais 14 est également l'equivalent hexadécimale de 20. Comment différencier ces deux valeur de 14 ? En mettant le préfix. 0x14 est bien différent de 14.

Par conséquent, si tu veux te déplacer de 20 octets tu peux faire soit fs.Seek(20, SeekOrigin.Begin); Soit fs.Seek(0x14, SeekOrigin.Begin);


donc : i20; //Ou i 0x14;

fs.Seek(i, SeekOrigine.Begin


Visual Studio t'affiche par défaut les valeurs en décimal, donc si tu début, la valeur de "i" sera toujours 20. Mais tu as une petite icone "Hex" pour afficher en héxadécimale, dans ce cas, ta valeur sera toujours 0x14.

Le travail c'est la santé, ne rien faire c'est la préservé !!!
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
16 juil. 2007 à 17:05
J'ai ce préfix car je dois aller à l'offset 0x1299 par exemple d'une .dll. J'aimerais que le chiffre que j'ai obtenu en variable par l'utilisateur, qui est 1299 soit toujours sous forme hexadécimal, est-ce possible? Merci pour votre explication
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
16 juil. 2007 à 17:57
Si ta variable est un nombre, aucune conversion n'est nécéssaire, c'est automatique. Cependant, si c'est une entrée utilisateur, tu recoit une chaine de texte que tu convertit via System.Convert.ToInt32 ou quelque chose s'en approchant. Le but ici c'est de dire à ton convertisseur string->int que le nombre en entrée est sous sa forme hexadécimale.

Pour information, "Hexa" signifie 6 (hexagone), "déc" signifie 10 (décade).
Nous, pauvre humains au cerveau limité, comptons en base 10 aussi nommée "décimale". C'est plus pratique pour nous. Celà signifie qu'on compte de 0-9 avant d'ajoute un chiffre supplémentaire.

La base Hexadécimale c'est donc la base 16.

Maintenant que tu sais celà, en regardant la documentation de "int Convert.ToInt32(string value, int fromBase)" tu devrais pouvoir te passer de ce préfix.
0

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

Posez votre question
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
17 juil. 2007 à 21:58
Il n'éxiste pas de méthode avec le préfixe alors?
En tout cas merci pour le coup de pouce, si vous pouviez me mettre un exemple, je suis totalement largué...

Cordialement
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
18 juil. 2007 à 10:10
Salut !
Petit cours :
La notation 0x d'un nombre n'est que pour nous humains, car on est trop con pour faire la différence. Comme les compilateurs on été fait par des humains, eux aussi sont trop con pour faire la différence. Il existe beaucoup de prefix/suffixe aux nombre pour indiquer aux humains/compilateurs en quelle base il faut compter. Mais une fois en mémoire, le processeur s'en tape complet de la base dans laquelle tu veux lire/ecrire. Lui, il fait la différence (ou plus exactement, le compilateur s'est démerder pour tout lui traduire dans la seule base qu'il connait : la base 2, le binaire). Cependant un nombre est un nombre, il a une valeur. Tu peux l'afficher comme tu veux ca change pas sa valeur. Quand tu fait un chèque, tu écrit le montant en chiffre, puis en toute lettres. La valeur de ces deux montant est bien identiques non ? Pourtant ils s'écrivent pas pareil. C'est le même principe.

Imaginons que tu utilisateur entre un nombre dans une textbox. Le nombre qu'il va entrer sera sous la forme d'une chaine. ("1234", c'est bien une chaine, pas un nombre, si tu fait "1234" + "1234", ca te donnera pas "2468" mais "12341234"). C'est un humain qui a entrer la chaine. A toi de savoir dans quelle base il l'a entrée. Tu peux considérer qu'il la entrée en hexadécimal, ou qu'il la entrer en décimal. Puisque c'est toi qui décide, pas besoin de préfixe/suffixe. Exemple :

int offset = Convert.ToInt32(MonTextBox.Text, 16);

Avec ce code, que l'utilisateur ai tapé "123", "AB45" ou encore "Salut les gars", ton programme considère que c'est de l'hexadécimal. Si il arrive pas a convertir, c'est que l'utilisateur à entrer n'importe quoi.

Si tu tient tant que ca a ton préfixe, tu peux en "créer" un. C'est à dire que tu scanne ta chaine a la recherche d'un préfix afin de connaitre la base de convertion :

string MonNombre = MaTextBox.Text.Trim(); //Supprime les espaces
int MonNombreConvertit;
if(MonNombre.StartWith("0x") == true) //Si ta chaine commence par 0x
MonNombreConvertit = Convert.ToInt32(MonNombre.Remove(0, 2)); //Supprime le prefixe avant convertion en héxadécimal
else
MonNombreConvertit = Convert.ToInt32(MonNombre); //Sinon, on convertit en décimal
0
clubberzZ Messages postés 89 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 3 décembre 2007 1
18 juil. 2007 à 19:33
Merci d'avoir pris la peine d'expliquer entièrement la méthode à suivre, je vous en remercie, j'ai opter pour la première solution et tout marche parfaitement!
0
Rejoignez-nous