在c#中是否有简单的方法或方法将流转换为字节[]?
当前回答
在. net Framework 4及以后版本中,Stream类有一个内置的CopyTo方法可供使用。
对于框架的早期版本,方便的helper函数是:
public static void CopyStream(Stream input, Stream output)
{
byte[] b = new byte[32768];
int r;
while ((r = input.Read(b, 0, b.Length)) > 0)
output.Write(b, 0, r);
}
然后使用上面的方法之一复制到MemoryStream并调用GetBuffer:
var file = new FileStream("c:\\foo.txt", FileMode.Open);
var mem = new MemoryStream();
// If using .NET 4 or later:
file.CopyTo(mem);
// Otherwise:
CopyStream(file, mem);
// getting the internal buffer (no additional copying)
byte[] buffer = mem.GetBuffer();
long length = mem.Length; // the actual length of the data
// (the array may be longer)
// if you need the array to be exactly as long as the data
byte[] truncated = mem.ToArray(); // makes another copy
编辑:最初我建议使用Jason的答案为支持长度属性的流。但是它有一个缺陷,因为它假设Stream会在一个Read中返回它的所有内容,这并不一定是正确的(例如,对于Socket来说就不是这样)。我不知道在BCL中是否有一个流实现的例子,它支持长度,但可能会以比你请求的更短的块返回数据,但任何人都可以继承流,这很容易是这样的情况。
在大多数情况下,使用上面的通解可能会更简单,但假设你确实想直接读入一个bigEnough数组:
byte[] b = new byte[bigEnough];
int r, offset;
while ((r = input.Read(b, offset, b.Length - offset)) > 0)
offset += r;
也就是说,反复调用Read并移动将要存储数据的位置。
其他回答
Byte[] Content = new BinaryReader(file.InputStream).ReadBytes(file.ContentLength);
如果您从移动设备或其他发送文件
byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
好吧,也许我在这里遗漏了一些东西,但我是这样做的:
public static Byte[] ToByteArray(this Stream stream) {
Int32 length = stream.Length > Int32.MaxValue ? Int32.MaxValue : Convert.ToInt32(stream.Length);
Byte[] buffer = new Byte[length];
stream.Read(buffer, 0, length);
return buffer;
}
我知道的最简单的解决方法是:
using(var memoryStream = new MemoryStream())
{
sourceStream.CopyTo(memoryStream);
return memoryStream.ToArray();
}
byte[] buf; // byte array
Stream stream=Page.Request.InputStream; //initialise new stream
buf = new byte[stream.Length]; //declare arraysize
stream.Read(buf, 0, buf.Length); // read from stream to byte array