traductor texto pasar palabras mensajes link hexadecimal convertir convertidor como codigo binarios binario c# binaryfiles binaryreader

c# - texto - traductor de binario decimal



ComprobaciĆ³n de C#para el final del archivo del lector binario (4)

Estaba buscando una forma de verificar si he llegado al final de un archivo para mi lector binario y una sugerencia fue utilizar PeekChar como tal

while (inFile.PeekChar() > 0) { ... }

Sin embargo, parece que me he encontrado con un problema

Unhandled Exception: System.ArgumentException: The output char buffer is too sma ll to contain the decoded characters, encoding ''Unicode (UTF-8)'' fallback ''Syste m.Text.DecoderReplacementFallback''. Parameter name: chars at System.Text.Encoding.ThrowCharsOverflow() at System.Text.Encoding.ThrowCharsOverflow(DecoderNLS decoder, Boolean nothin gDecoded) at System.Text.UTF8Encoding.GetChars(Byte* bytes, Int32 byteCount, Char* char s, Int32 charCount, DecoderNLS baseDecoder) at System.Text.DecoderNLS.GetChars(Byte* bytes, Int32 byteCount, Char* chars, Int32 charCount, Boolean flush) at System.Text.DecoderNLS.GetChars(Byte[] bytes, Int32 byteIndex, Int32 byteC ount, Char[] chars, Int32 charIndex, Boolean flush) at System.Text.DecoderNLS.GetChars(Byte[] bytes, Int32 byteIndex, Int32 byteC ount, Char[] chars, Int32 charIndex) at System.IO.BinaryReader.InternalReadOneChar() at System.IO.BinaryReader.PeekChar()

Así que tal vez PeekChar no sea la mejor manera de hacerlo, y no creo que deba usarse de esa manera porque estoy verificando la posición actual de mi lector y no realmente lo que se supone que es el próximo personaje.


Añadiré mi sugerencia: si no necesitas la parte de "codificación" del BinaryReader (para que no uses los distintos ReadChar / ReadChars / ReadString) entonces puedes usar un codificador que nunca lo lanzará y que siempre es de un byte por char. Encoding.GetEncoding("iso-8859-1") es perfecto para esto. Lo pasa como un parámetro del constructor BinaryReader . La codificación iso-8859-1 es una codificación de un byte por carácter que mapea 1: 1 los primeros 256 caracteres de Unicode (por lo que el byte 254 es el char 254, por ejemplo)


Envolviéndolo en un Método de extensión personalizado que ampliará la clase BinaryReader al agregar el método EOF que falta.

public static class StreamEOF { public static bool EOF( this BinaryReader binaryReader ) { var bs = binaryReader.BaseStream; return ( bs.Position == bs.Length); } }

Entonces ahora puedes escribir:

while (!infile.EOF()) { // Read.... }

:) ... suponiendo que hayas creado un archivo en alguna parte como este:

var infile= new BinaryReader();

Nota: var es tipeo implícito. Feliz de encontrarlo, es otra pieza de rompecabezas para un código bien diseñado en C #. :RE


Hay una manera más precisa de verificar EOF cuando se trabaja con datos binarios. Evita todos los problemas de codificación que vienen con el enfoque PeekChar y hace exactamente lo que se necesita: para verificar si la posición del lector está al final del archivo o no.

while (inFile.BaseStream.Position != inFile.BaseStream.Length) { ... }


Este trabajo para mí:

using (BinaryReader br = new BinaryReader(File.Open(fileName, FileMode.Open))) { //int pos = 0; //int length = (int)br.BaseStream.Length; while (br.BaseStream.Position != br.BaseStream.Length) { string nume = br.ReadString (); string prenume = br.ReadString (); Persoana p = new Persoana (nume, prenume); myArrayList.Add (p); Console.WriteLine ("ADAUGAT XXX: "+ p.ToString()); //pos++; } }