2009-10-13 3 views
15

Есть ли способ прочитать двоичные данные из stdin в C#?Чтение двоичных данных из Console.In

В моей проблеме у меня есть программа, которая запускается и получает двоичные данные на stdin. В основном: C:>myImageReader < someImage.jpg

И я хотел бы написать программу, как:

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

Однако Console.In не поток, это TextReader. (И если я попытаюсь прочитать char [], TextReader интерпретирует данные, не позволяя мне получить доступ к необработанным байтам.)

Кто-нибудь получил хорошее представление о том, как получить доступ к фактическому двоичному входу?

Приветствие, Лейфа

ответ

25

Чтобы прочитать двоичными, лучший подход заключается в использовании потока сырья на входе - здесь показывая что-то вроде «эха» между стандартным вводом и стандартным выводом:

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

Хм, я бы предположил, что 'Console.OpenStandardInput()' вернет 'TextReader', а не' Stream'. – Powerlord

+0

Остерегайтесь, однако, что файлы трубопроводов из командной строки открывают их в текстовом режиме, поэтому вы не можете использовать двоичные данные! – Noldorin

+2

Нужно ли нам вставлять стандартный поток вывода в оператор 'using'? – SerG

1

Что об использовании параметр, указывающий путь к файлу, и вы открываете файл для двоичного ввода в коде?

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); 
    } 
} 
Смежные вопросы