Я получаю объект streamreader результата.
Я хочу преобразовать результат в байт [].
Как я могу преобразовать streamreader в byte []?
Спасибо
Я получаю объект streamreader результата.
Я хочу преобразовать результат в байт [].
Как я могу преобразовать streamreader в byte []?
Спасибо
StreamReader предназначен для текста, а не для простых байтов. Не используйте StreamReader, а вместо read непосредственно из базового потока.
Просто бросьте все, что вы читаете, в 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();
}
Вы можете использовать этот код: Вы не должны использовать этот код:
byte[] bytes = streamReader.CurrentEncoding.GetBytes(streamReader.ReadToEnd());
Пожалуйста, см. комментарий к этому ответу о том, почему. Я оставлю ответ, поэтому люди знают о проблемах с этим подходом, потому что я до сих пор не занимался.
Вы также можете использовать 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);
Для всех, говорящих, чтобы получить байты, скопируйте их на 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
.