2

我试图通过将部分读入字节数组来将内存流分成块,但我认为我有一些根本性的错误。我可以读取第一个块,但是当我尝试读取内存流的其余部分时,即使有更多字节要读取,我也会使索引超出范围。似乎问题在于接收字节缓冲区的大小需要与内存流一样大。我需要将其转换为块,因为代码位于 Web 服务中。

任何人都知道这段代码有什么问题

fb.buffer 是 MemoryStream

  long bytesLeft = fb.Buffer.Length;
                fb.Buffer.Position = 0;
                int offset =0;
                int BUFF_SIZE = 8196;


                while (bytesLeft > 0)
                {
                    byte[] fs = new byte[BUFF_SIZE];

                    fb.Buffer.Read(fs, offset, BUFF_SIZE);
                    offset += BUFF_SIZE;
                    bytesLeft -= BUFF_SIZE;
                }
4

2 回答 2

2

请一目了然地查看MSDN中的此代码Stream.Readoffset- 您不应该递增- 它应该始终为零。当然,除非您碰巧事先知道流的确切长度(因此您将创建确切大小的数组)。

您还应该始终获取从Read(返回值)读取的字节数。

如果您希望将其拆分为“块”,您的意思是您想要n 个8k 块吗?然后你可能想做这样的事情:

List<byte[]> chunks = new List<byte[]>();
byte chunk = new byte[BUFF_SIZE];
int bytesRead = fb.Buffer.Read(chunk, 0, BUFF_SIZE);
while(bytesRead > 0)
{
  if(bytesRead != BUFF_SIZE)
  {
    byte[] tail = new byte[bytesRead];
    Array.Copy(chunk, tail, bytesRead);
    chunk = tail;
  }
  chunks.Add(chunk);
  bytesRead = fb.Buffer.Read(chunk, 0, BUFF_SIZE);
}

请特别注意,最后一个块的长度很可能不会完全准确BUFF_SIZE

于 2012-04-16T07:50:48.260 回答
2

offset这是数组的偏移量。这里应该为零。您还应该查看. 即使有更多数据可用Read,也不能保证会填满缓冲区。

但是,如果这是MemoryStream- 一个更好的选择可能是ArraySegment<byte>,它不需要重复数据。

于 2012-04-16T07:42:58.380 回答