Conversion int16

Résolu
keerigan Messages postés 54 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 31 mai 2012 - 13 juin 2006 à 11:01
keerigan Messages postés 54 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 31 mai 2012 - 13 juin 2006 à 14:59
Bonjour,

Je dois creer une trame socket et dans celle ci je dois ecrire sur 2 caracteres un entier 16 bits, je ne vois pas du tous comment faire

quelqu'un peut eclairer ma pauvre lanterne avec un petit exemple ?

Merci d'avance

Stéphane

5 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
13 juin 2006 à 12:51
tu ne peux pas concaténer le tout dans une string. je suppose que tu essaie de faire

string StrTrame = Entete + Id + Data + '\r';






si cest ce que tu veux faire tu dois plutot taper

string StrTrame = Entete + System.Text.
Encoding.ASCII.GetString(Id, 0, 2) + Data + '\r';

mais a priori si tu veux utiliser un tableau de byte que tu place dans un socket, tu devrais utiliser une list de bytes que tu convertis apres...

List BytesList = new List();

bytesList.AddRange(System.Text.Encoding.ASCII.GetBytes(Entete));
bytesList.AddRange(Id);
bytesList.AddRange(System.Text.
Encoding.ASCII.GetBytes(Data));
bytesList.Add(Convert.ToByte('\r'));

byte[] ByteArray = BytesList.ToArray();

pour extraire les chaines de la lecture :

string StrTrame = System.Text.

Encoding.ASCII.GetString(ByteArrayRead, 0, ByteArrayRead.Length);

par contre si tes chaines sont variables....il va te falloir trouver une solution pour délimiter tes champs....si tes chaines ne peuvent contenir ni valeur numérique ni '\r', tu auras juste a parser le contenu de ta trame. sinon tu vas devoir intégrer la longueur de champ dans ta trame....(ou autre solution mais cest a priori le mieux)

 
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
13 juin 2006 à 11:36
je suis pas très sur de moi, mais voila qui doit marcher correctement :

byte[] MyByteArray = new byte[2];
byte[0] = Convert.ToByte(MyInt16 >>  8); //copie du premier octet
byte[1] = Convert.ToByte(MyInt16 | 0xFF); //copie du second octet

tu utilise les opérations directement sur les bits. dans le premier octet tu copie MyInt16 décalé a droite de 8 bits, ce qui signifie que tu ne prend que les 8 premiers bits.
dans le second octet tu copie le contenu de ton entier en passant tous les bits du premier octet a 0 et en gardants ceux du second a leur valeur.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
13 juin 2006 à 11:41
erreur de frappe stupide :

byte[1] = Convert.ToByte(MyInt16 & 0xFF); //copie du second octet
0
keerigan Messages postés 54 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 31 mai 2012
13 juin 2006 à 12:07
Merci de ta reponse :) qui fonctionne ^^

J'ai vraiment du mal ce matin lol mais je n'arrive pas a l'integrer dans ma trame
celle ci ressemble a ca :

[Entete][id][Data]<cr>

[Entete] et [Data] sont de brave string de longueur variable

quand a [id] c'est le fameux int16 sur 2 caracteres

si j'essaie de concatener les 3 pour former ma trame , je me retouve avec system.byte() a la place de mon id


encore un petit coup de main ?


 


Merci


 


Stéphane


 
0

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

Posez votre question
keerigan Messages postés 54 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 31 mai 2012
13 juin 2006 à 14:59
Merci beaucoup de ton aide


 


Stéphane
0
Rejoignez-nous