8.13. Leer datos nativos
Curso: Programación en C# (2015), por Nacho Cabanes
8.13. Leer datos nativos
Un FileStream es cómodo para leer byte a byte, pero no tanto cuando queremos leer otros tipos de datos básicos existentes en C# (short, int, float, etc.). Para eso usaremos la clase "BinaryReader". Por ejemplo, podríamos leer el entero corto que forman los dos bytes iniciales de un fichero con:
?// Ejemplo_08_13a.cs // Ficheros binarios: lectura de un short, con BinaryReader // Introducción a C#, por Nacho Cabanes using System; using System.IO; public class Ejemplo_08_13a { public static void Main() { Console.WriteLine("Introduzca el nombre del fichero"); string nombre = Console.ReadLine(); BinaryReader fichero = new BinaryReader( File.Open(nombre, FileMode.Open)); short dato = fichero.ReadInt16(); Console.WriteLine("El dato leido es {0}", dato); fichero.Close(); } }
Si preferimos hacer esta lectura byte a byte, podremos usar tanto un FileStream como un BinaryReader, pero deberemos recomponer ese "short", teniendo en cuenta que, en la mayoría de sistemas actuales, en primer lugar aparece el byte menos significativo y luego el byte más significativo, de modo que el dato sería byte1 + byte2*256, así:
?// Ejemplo_08_13b.cs // Ficheros binarios: lectura de un short, byte a byte // Introducción a C#, por Nacho Cabanes using System; using System.IO; public class Ejemplo_08_13b { public static void Main() { Console.WriteLine("Introduzca el nombre del fichero"); string nombre = Console.ReadLine(); BinaryReader fichero = new BinaryReader( File.Open(nombre, FileMode.Open)); short dato1 = fichero.ReadByte(); short dato2 = fichero.ReadByte(); Console.WriteLine("El dato leido es {0}", dato1 + dato2*256); fichero.Close(); } }
También podemos emplear la cláusula "using", para que el fichero se cierre automáticamente, así:
?// Ejemplo_08_13c.cs // Ficheros binarios: lectura de un short, con BinaryReader, using // Introducción a C#, por Nacho Cabanes using System; using System.IO; public class Ejemplo_08_13c { public static void Main() { Console.WriteLine("Introduzca el nombre del fichero"); string nombre = Console.ReadLine(); using (BinaryReader fichero = new BinaryReader( File.Open(nombre, FileMode.Open))) { short dato = fichero.ReadInt16(); Console.WriteLine("El dato leido es {0}", dato); } } }
Ejercicios propuestos:
Ejercicio propuesto 8.13.1: Abre un fichero con extensión EXE y comprueba si comienza con el entero corto 23117.
Ejercicio propuesto 8.13.2: Abre una imagen en formato BMP y comprueba si comienza con el entero corto 19778.
También podemos usar "Seek" para movernos a un punto u otro de un fichero si usamos un "BinaryReader", pero está un poco más escondido: no se lo pedimos directamente a nuestro fichero, sino al "Stream" (flujo de datos) que hay por debajo, a su "BaseStream", así: ficheroEntrada.BaseStream.Seek( 1, SeekOrigin.Begin);
Por ejemplo, la anchura de una imagen en formato BMP es un entero de 32 bits que se encuentra en la posición 18, de modo que podríamos hacer:
?// Ejemplo_08_13d.cs // Ficheros binarios: Seek, con BinaryReader // Introducción a C#, por Nacho Cabanes using System; using System.IO; public class Ejemplo_08_13d { public static void Main() { Console.WriteLine("Introduzca el nombre del fichero BMP"); string nombre = Console.ReadLine(); BinaryReader fichero = new BinaryReader( File.Open(nombre, FileMode.Open)); fichero.BaseStream.Seek(18, SeekOrigin.Begin); int ancho = fichero.ReadInt32(); Console.WriteLine("El ancho es {0}", ancho); fichero.Close(); } }
Ejercicios propuestos:
Ejercicio propuesto 8.13.3: El alto de un fichero BMP es un entero de 32 bits que se encuentra en la posición 22. Amplía el ejemplo 08_13d, para que muestre también el alto de ese fichero BMP.
Actualizado el: 22-03-2015 17:06