在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[] 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

在. 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并移动将要存储数据的位置。

"bigEnough" array is a bit of a stretch. Sure, buffer needs to be "big ebough" but proper design of an application should include transactions and delimiters. In this configuration each transaction would have a preset length thus your array would anticipate certain number of bytes and insert it into correctly sized buffer. Delimiters would ensure transaction integrity and would be supplied within each transaction. To make your application even better, you could use 2 channels (2 sockets). One would communicate fixed length control message transactions that would include information about size and sequence number of data transaction to be transferred using data channel. Receiver would acknowledge buffer creation and only then data would be sent. If you have no control over stream sender than you need multidimensional array as a buffer. Component arrays would be small enough to be manageable and big enough to be practical based on your estimate of expected data. Process logic would seek known start delimiters and then ending delimiter in subsequent element arrays. Once ending delimiter is found, new buffer would be created to store relevant data between delimiters and initial buffer would have to be restructured to allow data disposal.

只要代码转换流字节数组是一个下面。

Stream s = yourStream;
int streamEnd = Convert.ToInt32(s.Length);
byte[] buffer = new byte[streamEnd];
s.Read(buffer, 0, streamEnd);

如果您从移动设备或其他发送文件

    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;
}