Buffer.BlockCopy不能多次运行

时间:2015-09-08 07:43:58

标签: c# sql arrays buffer varbinary

我有一个类,每次接收缓冲区时它应该附加到一个更大的字节数组,但它只是第一次执行块复制,然后它不会复制任何内容 缓冲区第一次进入类时,它会复制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;
}

2 个答案:

答案 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。你说它count0时是有效的(第一次);让我们考虑当count非零时的情况。您告诉它将fileSize字节从buffer复制到allData,从0中的偏移buffer开始读取,并开始在偏移{{1}处写入在offset中。我们知道当allData非零时,count不为零。由于offst长度为allData个字节,因此总是溢出边界(写作位置的结尾为fileSizefileSize+offst为非-zero和数组的长度为offst)。我希望你提出一个fileSize,但你并没有告诉我们。

编辑:实际上,它是ArgumentOutOfRangeException

  

ArgumentException:偏移量和长度超出数组的范围,或者计数大于索引源集合末尾的元素数。

基本上:要么你的参数错误,要么你告诉它做一些永远不会有用的事情。

您有可能(可能?):

System.ArgumentException