2009-03-31 3 views
0

У меня есть массив байтов, который я получил из FileStream.Read, и я хотел бы превратить это в строку. Я не на 100% уверен в кодировке - это просто файл, который я сохранил на диск - как мне сделать преобразование? Есть ли класс .NET, который читает метку порядка байтов и может определить кодировку для меня?Как преобразовать массив байтов в строку

ответ

1

Если File.ReadAllText будет читать файл правильно, у вас есть несколько вариантов.

Вместо вызова BeginRead, вы можете просто позвонить File.ReadAllText асинхронно:

delegate string AsyncMethodCaller(string fname); 

    static void Main(string[] args) 
    { 
     string InputFilename = "testo.txt"; 
     AsyncMethodCaller caller = File.ReadAllText; 
     IAsyncResult rslt = caller.BeginInvoke(InputFilename, null, null); 

     // do other work ... 

     string fileContents = caller.EndInvoke(rslt); 
    } 

Или вы можете создать MemoryStream из массива байтов, а затем использовать StreamReader по этому вопросу.

0

System.IO.File.ReadAllText делает то, что вы хотите.

+0

Я бы, если бы я мог, но, к сожалению, мне нужно сделать это ASync используя метод BeginRead который только возвращает массив байтов ... – 2009-03-31 05:06:34

+0

Fair достаточно тогда. В этом случае ответ jon skeet ниже (или выше, теперь, вероятно) хорош. – Chris

+0

Также ReadAllText предполагает UTF-8. –

5

См. how-to-guess-the-encoding-of-a-file-with-no-bom-in-net.

Поскольку строки Юникод, вы должны указать кодировку при преобразовании. Текстовые потоки (даже ReadAllText()) имеют активную кодировку внутри, обычно это разумное значение по умолчанию.

1

попробовать что-то вроде этого:

buffer = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buffer); 
newString = Encoding.UTF8.GetString(buffer, 0, len); 
+0

Почему это лучше, чем просто использовать Encoding.GetEncoding («iso-8859-1»). GetString (...) в первую очередь? Дело в том, что ОП не знает, что такое кодировка. –

1

Как много вы знаете о файле? Может ли это быть любой кодировкой? Если это так, вам нужно будет использовать эвристику, чтобы угадать кодировку. Если это будет UTF-8, UTF-16 или UTF-32, то

new StreamReader(new MemoryStream(bytes), true) 

определит кодировку автоматически. Текст довольно неприятный, если вы действительно не знаете кодировку. Есть много случаев, когда вы действительно просто гадали.

1

Там нет простого способа получить кодировку, но, как упоминалось выше, использование

string str = System.Text.Encoding.Default.GetString(mybytearray); 

если вы не имеете ни малейшего представление о том, что кодирование. Если вы находитесь в Европе, то ISO-8859-1, вероятно, является кодировкой.

string str = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(mybytearray);