Кодировка текстовых потоков


В C# используются следующие статические свойства класса System.Text.Encoding для кодировки текстовых потоков

Кодировка Описание
ASCII Кодировка ASCII без символов кириллицы, в которой для представления текстовых символов используются младшие 7 бит байта
Unicode Кодировка UNICODE. Для представления символов используется 16 бит (т. е. 2 байта). Сигнатура = FF FE в нач.файла для StreamWriter
UTF7 Кодировка UCS Transformation Format. Применяется для представления символов UNICODE. В ней используются младшие 7 бит данных
UTF8 To же, но для представления символов UNICODE в ней используется 8 бит данных
Default Системная кодировка ANSI (не путайте ее с кодировкой ASCII). В этой кодировке для представления каждого символа используется 8 бит данных

Свойства класса кодировки System.Text.Encoding:

ASCII – 1 байт (старший бит = 0);

Default – по умолчанию (UTF8);

Unicode – 2 байта;

UTF32 – 4 байта;

UTF7 – 1 байт, старший бит не используется;

UTF8 – 1 байт (по умолчанию в .NET).

 

 


ФАЙЛЫ В ОП, ДВОИЧНЫЕ ПОТОКИ,

НЕПОТОКОВЫЙ ВВОД-ВЫВОД, ПРЯМОЙ ДОСТУП К ФАЙЛУ.

 

Файлы в оперативной памяти

Присоединение массива байтов к классам StreamReader или StreamWriter.

Класс MemoryStream

 

Иногда удобно создать модель файла в ОП. В этом случае нужно заменить открытие файла на создание потока в памяти.

Класс MemoryStream определяет поток байтов в оперативной памяти (см. рис.1). Класс MemoryStream — это реализация класса Stream.

 

 


рис.1

Для работы с этим потоком могут использоваться классы StreamReader и StreamWriter. С помощью их методов можно считывать входные данные из массива байтов или записывать их в массив.

Один из конструкторов класса MemoryStream:

 

MemoryStream (byte[ ] buf)

 

buf — это массив байтов, который предполагается использовать в операциях ввода-вывода в качестве источника и/или приемника информации.

• Поток доступен как на чтение, так и на запись.

• В по­ток, создаваемый этим конструктором, можно записывать данные или считывать их из него.

• Перед использованием этого конструк­тора необходимо позаботиться о достаточном размере массива buf, чтобы он позволил сохранить все направляемые в него данные.

• Этот поток поддерживает метод Seek(), который позволяет перед выполнением чтения/записи сместиться к любому байту массива.

 

Пример:

 

// Демонстрация использования класса MemoryStream.

using System;

using System.IO;

class MemStrDemo

{

public static void Main()

{

byte[ ] storage = new byte[255]; // Модель файла

 

// Создаем поток с ориентацией на память.

MemoryStream mem = new MemoryStream (storage);

 

// Помещаем объект mem в оболочку StreamWriter.

StreamWriter memWtr = new StreamWriter (mem);

 

// Записываем данные в память с помощью объекта memWtr.

for (int i = 0; i < 10; i++)

memWtr.WriteLine ("byte [{0}]: {0}", i);

 

memWtr.Write ('.'); // Ставим в конце точку.

memWtr.Flush (); // Форсируем вывод

 

 

Console.WriteLine ("Считываем данные прямо из массива storage: ");

 

// Отображаем напрямую содержимое памяти.

foreach (char ch in storage)

{

if (ch == '.') break; // После точки будет EOF, который является концом строки.

Console.Write (ch);

}

 

Console.WriteLine("\nСчитываем данные посредством объекта memRdr: ");

 

// Помещаем объект mem в оболочку StreamReader.

StreamReader memRdr = new StreamReader (mem);

 

// Считываем данные из объекта mem, используя средство чтения потоков.

 

mem.Seek (0, SeekOrigin.Begin); // Установка указателя позиции

// в начало потока.

string str = memRdr.ReadLine();

 

while (str != null)

{

str = memRdr.ReadLine();

if (str.CompareTo(".") == 0) break; // После точки следует EOF,

// поэтому точка считывается как строка.

Console.WriteLine(str);

}

}

}

 

Вот как выглядят результаты выполнения этой программы:

 

Считываем данные прямо из массива storage:

byte [0] : 0

byte [1] : 1

byte [2] : 2

byte [3] : 3

byte [4] : 4

byte [5] : 5

byte [6] : 6

byte [7] : 7

byte [8] : 8

byte [9] : 9

 

Считываем данные посредством объекта memRdr:

byte [0] : 0

byte [1] : 1

byte [2] : 2

byte [3] : 3

byte [4] : 4

byte [5] : 5

byte [6] : 6

byte [7] : 7

byte [8] : 8

byte [9] : 9

 

Вместо

mem.Seek (0, SeekOrigin.Begin);

 

можно применить

memWtr.Close();

mem = new MemoryStream (storage);

 



Дата добавления: 2019-02-08; просмотров: 593;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.014 сек.