2009-11-07 5 views
0

Quand j'écris:problème étrange lorsque vous essayez de lire les données

var tagType = _reader.ReadByte(); 

while (tagType != 8) 
{ 
    var skip = ReadNext3Bytes() + 11; 
    _reader.BaseStream.Position += skip; 

    tagType = _reader.ReadByte(); 
} 

... ça fonctionne, mais quand j'écris:

var tagType = _reader.ReadByte(); 

while (tagType != 8) 
{ 
    _reader.BaseStream.Position += ReadNext3Bytes() + 11; 
    tagType = _reader.ReadByte(); 
} 

... il ne fonctionne pas, et je peux ne comprends pas pourquoi - je reçois des résultats inattendus. Heres la méthode ReadNext3Bytes:

private long ReadNext3Bytes() 
    { 
     try 
     { 
      return Math.Abs((_reader.ReadByte() & 0xFF) * 256 * 256 + (_reader.ReadByte() & 0xFF) 
       * 256 + (_reader.ReadByte() & 0xFF)); 
     } 
     catch 
     { 
      return 0; 
     } 
    } 

Pourquoi est-ce, et comment puis-je résoudre ce problème?

Merci.

+1

Que voulez-vous dire par «il ne fonctionne pas? Une exception est lancée? Vous obtenez des résultats inattendus? – Phaedrus

+0

Oui, je reçois des résultats inattendus. –

+1

Quels sont les résultats attendus? Quels résultats obtenez-vous? –

Répondre

2

Il arrive depuis Position est modifiée pendant ReadByte appel, ce que vous voyez est semblable à ce cas:

int position = 1; 
position += (position = 2) + 3; 

Assert.AreEqual(6, position); 
+0

Oh !!!!! Merci! –

+0

.NET stocke la valeur de Position avant de commencer à évaluer le côté droit de l'affectation, le meilleur moyen est le plus simple: le premier formulaire que vous avez écrit qui a fonctionné. La deuxième façon, que j'aime moins, est de réduire 3 de l'expression d'incrément: _reader.BaseStream.Position + = ReadNext3Bytes() + 11 - 3; – Elisha

Questions connexes