2017-06-26 3 views
0

J'ai un BinaryReader lu dans un nombre d'octets dans un tableau. Le flux sous-jacent pour le lecteur est un BufferedStream (dont le flux sous-jacent est un flux réseau). J'ai remarqué que parfois la méthode reader.Read(arr, 0, len) renvoie des résultats (erronés) différents de reader.ReadBytes(len).C# BinaryReader ReadBytes (len) renvoie des résultats différents de Read (octets, 0, len)

Fondamentalement, mon code de configuration ressemble à ceci:

var httpClient = new HttpClient(); 
var reader = new BinaryReader(new BufferedStream(await httpClient.GetStreamAsync(url).ConfigureAwait(false))); 

Plus tard en bas de la ligne, je lis un tableau d'octets du lecteur. Je peux confirmer que la variable sz est la même pour les deux scénarios.

int sz = ReadSize(reader); //sz of the array to read 
if (bytes == null || bytes.Length <= sz) 
{ 
    bytes = new byte[sz]; 
} 

//reader.Read will return different results than reader.ReadBytes sometimes 
//everything else is the same up until this point 
//var tempBytes = reader.ReadBytes(sz); <- this will return right results 
reader.Read(bytes, 0, sz); // <- this will not return the right results sometimes 

Il semble que la méthode reader.Read est en train de lire plus loin dans le cours d'eau que nécessaire ou quelque chose, parce que le reste de l'analyse syntaxique cassera après cela se produit. Évidemment, je pourrais coller avec lecteur.ReadBytes, mais je veux réutiliser le tableau d'octets pour aller facile sur le GC ici.

Y aurait-il une raison que cela se produise? Un réglage est-il faux ou quelque chose?

+0

Peut-être quelque chose lié au fait qu'il s'agit d'un flux réseau? Lorsque vous créez le nouveau tableau d'octets, vous "gèlerez" une petite partie du flux, mais lorsque vous analyserez plus tard ce flux "figé" avec le reste, il ne correspondra pas. Attention: je n'ai jamais travaillé avec le flux réseau, je vole totalement par mon pantalon :) –

+0

Sous quelle condition ReadBytes peut-il lire moins d'octets puis demandé? Sous quelle condition 'Read' peut lire moins d'octets puis demandé? En quoi ces conditions sont-elles différentes? – PetSerAl

Répondre

0

Assurez-vous d'avoir effacé le tableau bytes avant d'appeler cette fonction car Read(bytes, 0, len) ne supprime PAS le tableau d'octets donné, donc certains octets précédents peuvent entrer en conflit avec un nouveau. J'ai aussi eu ce problème il y a longtemps dans l'un de mes parseurs. Il suffit de mettre tous les éléments à zéro, ou assurez-vous que vous lisez seulement (analyse) jusqu'à len