我有一个类,每次接收缓冲区时它应该附加到一个更大的字节数组,但它只是第一次执行块复制,然后它不会复制任何内容 缓冲区第一次进入类时,它会复制allData中的内容。但第二次它全部为零,尽管缓冲区包含数据。 这是我的代码:
public Boolean WriteBlobsToDB(byte[] buffer, int offset, int fileSize, string fileName, string fileType, string user, int count, int NChunks, string md5Src,int id)
{
bool ret = false;
int l = buffer.Length; // The buffer length is almost 2 MB
var allData = new byte[fileSize];
int offst = count * offset; // count is 0 the first timethen each time a new buffer comes, the value of count in count++
Buffer.BlockCopy(buffer, 0, allData, offst, fileSize);
if (count == NChunks-1 ) // NChunks is the number of how many time the buffer would be passed here
{ // the meaning of this if is that, when all the buffer of a file is passed then move to the database and upload the table
File_List fl = new File_List();
fl.FileName = fileName;
fl.Id = id;
fl.FileType = fileType;
fl.MD5 = md5Src;
fl.Data = new Binary(allData);
try
{
dc.SubmitChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
return ret;
}
答案 0 :(得分:0)
您在buffer[]
中收到一大块字节,并将其复制到本地变量中。
您正在复制每次新创建的名为allData
的局部变量中的字节。
您也应该将接收缓冲区allData
传递给函数。
答案 1 :(得分:0)
var allData = new byte[fileSize];
int offst = count * offset;
Buffer.BlockCopy(buffer, 0, allData, offst, fileSize);
此处,allData
的长度为fileSize
。你说它count
是0
时是有效的(第一次);让我们考虑当count
非零时的情况。您告诉它将fileSize
字节从buffer
复制到allData
,从0
中的偏移buffer
开始读取,并开始在偏移{{1}处写入在offset
中。我们知道当allData
非零时,count
不为零。由于offst
长度为allData
个字节,因此总是溢出边界(写作位置的结尾为fileSize
,fileSize+offst
为非-zero和数组的长度为offst
)。我希望你提出一个fileSize
,但你并没有告诉我们。
编辑:实际上,它是ArgumentOutOfRangeException
:
ArgumentException
:偏移量和长度超出数组的范围,或者计数大于索引源集合末尾的元素数。
基本上:要么你的参数错误,要么你告诉它做一些永远不会有用的事情。
您有可能(可能?):
System.ArgumentException