Подтвердить что ты не робот

Преобразование StreamReader в байт []

Я получаю объект streamreader результата.

Я хочу преобразовать результат в байт [].

Как я могу преобразовать streamreader в byte []?

Спасибо

4b9b3361

Ответ 1

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

Ответ 2

Просто бросьте все, что вы читаете, в MemoryStream и получите массив байтов в конце. Как уже отмечалось, вы должны читать из основного потока, чтобы получить необработанные байты.

var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
    var buffer = new byte[512];
    var bytesRead = default(int);
    while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
        memstream.Write(buffer, 0, bytesRead);
    bytes = memstream.ToArray();
}

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

var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
    reader.BaseStream.CopyTo(memstream);
    bytes = memstream.ToArray();
}

Ответ 3

Вы можете использовать этот код: Вы не должны использовать этот код:

byte[] bytes = streamReader.CurrentEncoding.GetBytes(streamReader.ReadToEnd());

Пожалуйста, см. комментарий к этому ответу о том, почему. Я оставлю ответ, поэтому люди знают о проблемах с этим подходом, потому что я до сих пор не занимался.

Ответ 4

Вы также можете использовать CopyTo:

var ms = new MemoryStream();
yourStreamReader.BaseStream.CopyTo(ms); // blocking call till the end of the stream
ms.GetBuffer().CopyTo(yourArray, ms.Length);

или

var ms = new MemoryStream();
var ct = yourStreamReader.BaseStream.CopyToAsync(ms);
await ct;
ms.GetBuffer().CopyTo(yourArray, ms.Length);

Ответ 5

Для всех, говорящих, чтобы получить байты, скопируйте их на MemoryStream и т.д. - если предполагается, что содержимое не будет больше, чем память компьютера, должно разрешаться, почему бы просто не использовать StreamReader built в ReadLine() или ReadToEnd()? Я видел, что об этом даже не упоминалось, и они делают все для вас.

У меня был прецедент, где я просто хотел сохранить путь к SQLite файлу из FileDialogResult, который пользователь выбирает во время процесса синхронизации/инициализации. Затем моя программа должна использовать этот путь, когда он запускается для обычных процессов приложения. Возможно, это не идеальный способ захвата/повторного использования информации, но это не сильно отличается от записи/чтения из файла .ini - я просто не хотел устанавливать одно значение для одного значения. Поэтому я просто прочитал его из плоского текстового файла с одной строкой. Вот что я сделал:

string filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!filePath.EndsWith(@"\")) temppath += @"\"; // ensures we have a slash on the end
filePath = filePath.Replace(@"\\", @"\"); // Visual Studio escapes slashes by putting double-slashes in their results - this ensures we don't have double-slashes
filePath += "SQLite.txt";

string path = String.Empty;
FileStream fs = new FileStream(filePath, FileMode.Open);
StreamReader sr = new StreamReader(fs);
path = sr.ReadLine();  // can also use sr.ReadToEnd();
sr.Close();
fs.Close();
fs.Flush();

return path;

Если вам действительно нужна byte[] вместо string по какой-либо причине, используя мой пример, вы всегда можете:

byte[] toBytes = Encoding.ASCII.GetBytes(path);

и верните toBytes вместо path.