Метод FileStream Write () записывает только неизвестные символы - PullRequest
1 голос
/ 18 января 2012

это мой код, и он записывает только эти символы в fileout.txt. что не так и как это исправить?

byte[] bArray = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        FileStream file_out = new FileStream(@"C:\fileout.txt",
            FileMode.Create);

        file_out.Write(bArray, 2, 4);

        file_out.Close();

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

Ответы [ 3 ]

4 голосов
/ 18 января 2012

Ваши выходные данные - это действительные байты, а не символы, которые представляют их для англоговорящих людей (и многих других языков, но не для всех).

Символы, которые вы бы написали, являются некоторыми элементами управления в основномисторический интерес, хотя ANPA-1312 по-прежнему используется Associated Press и использует их:

НАЧАЛО ТЕКСТА Предшествует фактическому тексту сообщения.(0x01, то, что вы пропустили, является началом заголовка.

END OF TEXT Конец текста. Кроме того, Ctrl + C для завершения работающей программы DOS - это элемент управления.

END OFTRANSMISSION Goodbye. Используется как символ выхода из системы.

ЗАПРОС Вы все еще там?

В вашем массиве для печати также есть:

NULL (ноль, не чтоnull означает в C #): используется в некоторых форматах для представления конца строки, «конца значимого текста» и т. Д.

ЗАПУСК ГОЛОВКИ: упомянуто выше.

ACKNOWLEDGE ДаЯ здесь. Также используется при встряхивании TCP / IP.

BELL Есть еще принтеры, которые будут работать, если вы отправите им это.

BACKSPACE Printing uзатем backspace тогда ¨ был один раз, как вы написали бы ü. Помните, что если Unicode кажется более сложным, чем ASCII. На самом деле проще просто иметь ü. Также назад и X и назад и X и назад и Xбыл старый "удалить"!

CHARACTER TAB первый из этих символовчто вы, вероятно, когда-либо будете использовать в современном коде, который не очень низкого уровня.Символ «табуляция».Конечно, сам по себе он не выглядит много.

Что вы, возможно, хотели, чтобы вывести символы, '0', '1' и т. Д.

Вы могли бы:

Кодировать их вручную.'0' - это 0x30, '1' - это 0x31.Это одна из тех вещей, где вы должны знать, как это сделать, но на самом деле не должны делать это сами 99% времени.

Используйте текстовый редактор.Он принимает значения разных типов и (необязательно с определенными правилами форматирования) выводит текст, который их представляет.Следовательно,

using(FileStream file_out = new FileStream(@"C:\fileout.txt", FileMode.Create)
using(TextWriter tw = new StreamWriter(file_out))
  for(int i = 2; i != 6; ++i)
    tw.Write(bArray[i]);

Это преобразует байты в их понятный человеку эквивалент по ходу и довольно эффективно.Это так же, как если бы вы выводили 0x32, 0x33, 0x34, 0x35, что будет выглядеть как «2345» при открытии в блокноте.

В большинстве случаев вы захотите писать байты напрямую, если вы получаете их отгде-то еще (например, создание или получение потока изображения откуда-то) или выполнение чего-то очень низкого уровня.

1 голос
/ 18 января 2012

Вы должны использовать что-то вроде

    public static void Main()
    {
        byte[] bArray = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

        using (StreamWriter outfile =
        new StreamWriter(@"C:\\fileout.txt"))
        {
            foreach (var b in bArray)
            {
                outfile.Write(b);
            }
        }

        Console.ReadLine();
    }

В результате вы получите текстовый файл, содержащий

0123456789

1 голос
/ 18 января 2012

Да, вы записываете байты 2, 3, 4, 5. Это не печатный текст ни в какой кодировке, о которой я знаю.

Мне не ясно, что вы ожидали,или почему вы ожидали, что он окажется печатным текстом - но если вы хотите записать текст (в отличие от двоичных) данных, вам следует использовать TextWriter некоторыхформа, например StreamWriter.

...