Conversion int16 [Résolu]

Signaler
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012
-
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012
-
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

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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)

 
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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.
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
erreur de frappe stupide :

byte[1] = Convert.ToByte(MyInt16 & 0xFF); //copie du second octet
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

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


 
Messages postés
54
Date d'inscription
jeudi 6 mars 2003
Statut
Membre
Dernière intervention
31 mai 2012

Merci beaucoup de ton aide


 


Stéphane