我试图通过将部分读入字节数组来将内存流分成块但我认为我有一些根本错误的东西。我可以读取第一个块但是当我尝试读取其余的内存流时,即使有更多的字节要读取,我也会得到索引。似乎问题是接收字节缓冲区的大小需要与memorystrem一样大。我需要将其转换为块,因为代码在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;
}
答案 0 :(得分:2)
offset
这里是到数组的偏移量。这里应该为零。您还应该查看Read
中的返回值。无法保证填充缓冲区,即使有更多数据可用。
但是,如果这是MemoryStream
- 更好的选项可能是ArraySegment<byte>
,这不需要重复数据。
答案 1 :(得分:2)
请一目了然地查看this code for Stream.Read
from MSDN - 您不应该递增offset
- 它应该始终为零。当然,除非您事先知道事件的确切长度(因此您将创建数组的确切大小)。
您还应始终获取从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
。