Tengo un flujo de memoria que lee una parte específica de mis datos. Del binario quiero un valor ReadInt32 de la posición 5-8. ¿Cómo logro esto en:

using (var reader = new BinaryReader(stream))
{

  somebyte1
  somebyte2
  somebyte3

  //get only this value
  int v = reader.ReadInt32;

}
0
user8333405 15 nov. 2017 a las 22:06

2 respuestas

La mejor respuesta

Mueva la secuencia base a la posición desde la que desea leer:

stream.Seek(4, SeekOrigin.Begin);

using (var reader = new BinaryReader(stream))
{
    int v = reader.ReadInt32;
}
0
Gusman 15 nov. 2017 a las 19:09

En .NET hay tipos de flujo que se pueden buscar y tipos que no permiten la búsqueda. Esto está indicado por la propiedad CanSeek. Si su secuencia permite la búsqueda (y una MemoryStream lo hace), puede mover la posición actual y leer los datos. Si la secuencia no permite la búsqueda, su única opción es leer y descartar los datos hasta que llegue a la posición de la secuencia donde se encuentran los datos deseados. Entonces, la solución generalizada a su problema sería:

const int targetPosition = 4;
BinaryReader reader = new BinaryReader(stream);
using (reader) {
    if (stream.CanSeek) {
        stream.Position = targetPosition;
    }
    else {
        reader.ReadBytes(targetPosition);
    }
    int result = reader.ReadInt32();
}
0
Sefe 15 nov. 2017 a las 19:46