2009-10-13 17 views
15

¿Hay alguna manera de leer datos binarios de stdin en C#?Lea los datos binarios de Console.In

En mi problema tengo un programa que se inicia y recibe datos binarios en stdin. Básicamente : C:>myImageReader < someImage.jpg

Y me gustaría escribir un programa como:

static class Program 
{ 
    static void Main() 
    { 
     Image img = new Bitmap(Console.In); 
     ShowImage(img); 
    } 
} 

Sin embargo Console.In no es una corriente, que es una TextReader. (Y si intento leer en char [], el TextReader interpreta los datos, no me permite acceder a los bytes sin formato.)

¿Alguien tiene una buena idea sobre cómo obtener acceso a la entrada binaria real?

Saludos, Leif

Respuesta

25

Para leer binario, el mejor enfoque es utilizar el flujo de entrada en bruto - aquí mostrando algo así como "eco" entre la entrada y salida estándar:

using (Stream stdin = Console.OpenStandardInput()) 
{ 
    using (Stream stdout = Console.OpenStandardOutput()) 
    { 
     byte[] buffer = new byte[2048]; 
     int bytes; 
     while ((bytes = stdin.Read(buffer, 0, buffer.Length)) > 0) { 
     stdout.Write(buffer, 0, bytes); 
     } 
    } 
} 
+0

Hmm, habría supuesto que 'Console.OpenStandardInput()' devolvería un 'TextReader' en lugar de' Stream'. – Powerlord

+0

¡Tenga en cuenta, sin embargo, que los archivos de tuberías de la línea de comandos los abre en modo texto, por lo que no puede usar datos binarios! – Noldorin

+2

¿De verdad necesitamos encerrar el flujo de salida estándar en la instrucción 'using'? – SerG

1

¿Qué pasa con el uso de un parámetro que especifica la ruta de acceso al archivo y abre el archivo de entrada binaria en el código?

static class Program 
{ 
    static int Main(string[] args) 
    { 
     // Maybe do some validation here 
     string imgPath = args[0]; 

     // Create Method GetBinaryData to return the Image object you're looking for based on the path. 
     Image img = GetBinaryData(imgPath); 
     ShowImage(img); 
    } 
}