J'ai un tableau d'octets que je lis depuis un NetworkStream. Les deux premiers octets indiquent la longueur du paquet qui suit et ensuite le paquet est lu dans un tableau d'octets de cette longueur. Les données que j'ai besoin de lire dans le tableau NetworkStream/byte ont quelques chaînes, c'est-à-dire des données de longueur variable terminées par de nouveaux caractères de ligne, et certains champs de largeur fixe comme des octets et des longs. Donc, quelque chose comme ceci:Lire la ligne du tableau d'octets (ne pas convertir le tableau d'octets en chaîne)
// I would have delimited these for clarity but I didn't want
// to imply that the stream was delimited because it's not.
StringbyteStringStringbytebytebytelonglongbytelonglong
Je sais (et ont leur mot à dire) le format du paquet de données qui vient à travers, et ce que je dois faire est de lire une « ligne » pour chaque valeur de chaîne, mais lisez un nombre fixe d'octets pour les octets et les longs. Jusqu'à présent, ma solution proposée consiste à utiliser une boucle while
pour lire des octets dans un tableau d'octets temp jusqu'à ce qu'il y ait un caractère de retour à la ligne. Ensuite, convertissez les octets en une chaîne. Cela me semble compliqué, mais je ne vois pas d'autre moyen évident. Je me rends compte que je pourrais utiliser StreamReader.ReadLine()
mais cela impliquerait un autre flux et j'ai déjà un NetworkStream
. Mais si c'est la meilleure solution, je vais essayer.
L'autre option que j'ai envisagée est d'avoir mon équipe backend écrire un octet ou deux pour les longueurs des valeurs String afin que je puisse lire la longueur et ensuite lire la chaîne en fonction de la longueur spécifiée. Donc, comme vous pouvez le voir, j'ai quelques options pour y arriver, et j'aimerais savoir ce que vous considérez comme la meilleure façon de le faire. Voici le code que j'ai en ce moment pour lire dans le paquet entier comme une chaîne. L'étape suivante consiste à séparer les différents champs du paquet et à effectuer le travail de programmation qui doit être effectué, en créant des objets, en mettant à jour l'interface utilisateur, etc. en fonction des données contenues dans le paquet.
string line = null;
while (stream.DataAvailable)
{
//Get the packet length;
UInt16 packetLength = 0;
header = new byte[2];
stream.Read(header, 0, 2);
// Need to reverse the header array for BitConverter class if architecture is little endian.
if (BitConverter.IsLittleEndian)
Array.Reverse(header);
packetLength = BitConverter.ToUInt16(header,0);
buffer = new byte[packetLength];
stream.Read(buffer, 0, BitConverter.ToUInt16(header, 0));
line = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
Console.WriteLine(line);
}
N'avait pas rencontré BinaryReader avant. Cela semble être extrêmement utile pour tout ce sur quoi je travaille. Merci! – jxpx777
Yah, le BinaryReader n'a pas fonctionné pour nous parce que les données sont écrites dans le thread par une application Java. J'ai fini par "forcer brutalement" en lisant dans le tableau d'octets, puis en le maudissant en fonction de notre structure de paquets de données. – jxpx777