в чем разница между потоковым и бинарным сценаристом?

17

это действительно смущает меня, скажем, я хочу сохранить целое число в файл, int x = 56, бинарный журнал принимает ascii-эквивалент представления 56 в памяти 00000000 00000000 00000000 00111000, который будет: null null null 8 и записать его в файл? я прав? может кто-нибудь объяснить, как эти две функции и когда я должен использовать каждый из них? im, используя c # btw. спасибо заранее!

    
задан noura 06.01.2011 в 12:17
источник
  • Это двоичное представление, а не ASCII. –  Marnix van Valen 06.01.2011 в 12:25
  • 00111000 = 0 * 1 + 0 * 2 + 0 * 4 + 1 * 8 + 1 * 16 + 1 * 32 + 0 * 64 + 0 * 128 = 56. –  Hans Passant 06.01.2011 в 13:31
  • Его не NULL NULL NULL 8 его 0 0 0 56 - в двоичном файле нет NULL. ASCII и его дириматы кодируют NULL как нулевой байт –  Adrian 06.01.2011 в 13:54

4 ответа

19

На страницах MSDN для StreamWriter и BinaryWriter вы можете четко видеть различия:

  

StreamWriter:

     

Реализует TextWriter для записи   символов в поток в определенном   кодирование.

и

  

BinaryWriter:

     

Записывает примитивные типы в двоичном виде на   поток и поддерживает записи строк в   специфическое кодирование.

Первый пишет вещи как текст, второй пишет в двоичном формате, маленький endian , поэтому int x = 56 будет написанное 00111000 00000000 00000000 00000000 .

    
ответ дан R. Martinho Fernandes 06.01.2011 в 12:23
источник
14

Двоичный писатель записывает двоичное представление в памяти целого числа. Писатель потока записывает представление ASCII. Вообще говоря, первый может быть более компактным и эффективным (рассмотрим возможность записи целого числа 23861398 - бинарный писатель потребует 4 байта, но писателю потока потребуется 8, 16 или даже 32 в зависимости от кодировки), но последнее приводит к простому старый текст.

    
ответ дан Kent Boogaart 06.01.2011 в 12:23
источник
5

Из того, что я могу различить ... StreamWriter больше подходит для текста, а BinaryWriter - для примитивных типов, включая строки конкретных кодировок. Говоря о том, что BinaryWriter пишет в двоичном коде, однако, он вводит в заблуждение людей, которые берут вещи по номиналу ... как и я. Я предположил, что когда я пишу целое число в базовый поток, он фактически записывал бы его в двоичном формате, и я мог бы читать его снова как поток 1 и 0. Положить вещи, как это выглядит в коде:

MemoryStream stream = new MemoryStream(); 

BinaryWriter bw = new BinaryWriter(stream);

bw.Write(35);

// is equivalent to doing:

stream.Write(BitConverter.GetBytes((int)35), 0, 4);

Хотя BinaryWriter использует смещение битов для извлечения байтов, а BitConverter использует небезопасное кастинг-указатель, результат тот же. Int - 32 бита или 4 байта в длину, и все, что он просто делает, записывает байты, которые представляют этот int в его базовый поток.

StreamWriter делает то же самое, что он предназначен для текста, поэтому целые числа не будут преобразованы в байты, а вместо этого в символы ... это похоже на запись:

byte[] buffer = Encoding.UTF8.GetBytes("my string here 1234");
stream.Write(buffer, 0, buffer.Length);

Вот почему я сказал, что вводить в заблуждение, чтобы сказать, что он пишет в двоичном формате .. потому что он делает .. технически. Разбейте каждый записанный байт на биты, и вы получите двоичные значения. Однако было бы разумнее сказать, что он пишет примитивные типы в виде массивов байтов. Если вы должны были преобразовать поток в строку, вы бы не получили строку из 1 и 0.

    
ответ дан SilverX 12.03.2011 в 07:03
источник
  • FYI stream.Write (BitConverter.GetBytes ((int) 35), 0, 4)); не компилируется –  Kcvin 29.05.2013 в 16:10
  • lol Извините, что написал это из памяти. просто удалите дополнительную скобку после 4 <. <--- отредактированного ответа –  SilverX 27.07.2013 в 07:44
2

StreamWriter для текста, а BinaryWriter записывает фактическое двоичное представление того, что вы хотите записать. Я не уверен на 100%, но почти:).

    
ответ дан Tomas Jansson 06.01.2011 в 12:22
источник