缓冲区.BlockCopy只能工作一次

本文关键字:一次 工作 BlockCopy 缓冲区 | 更新日期: 2023-09-27 18:11:35

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

缓冲区.BlockCopy只能工作一次

var allData = new byte[fileSize];
int offst = count * offset;
Buffer.BlockCopy(buffer, 0, allData, offst, fileSize);

其中,allData的长度为fileSize。你说当count0时它工作(第一次);那么,让我们考虑count不为零的情况。您告诉它将fileSize字节从buffer复制到allData,从buffer中的偏移量0开始读取,并从allData中的偏移量offset开始写入。我们知道当count不为零时,offst也不为零。由于allDatafileSize字节长,这将使总是溢出边界(写入位置的末尾将是fileSize+offst, offst非零,数组长度为fileSize)。我希望它会提高一个ArgumentOutOfRangeException,而你没有告诉我们。

编辑:实际上,它是一个ArgumentException:

System.ArgumentException:偏移量和长度超出了数组的范围,或者count大于从源集合索引末尾开始的元素数

基本上:要么你把参数设置错了,要么你告诉它做一些永远不会工作的事情。

有可能(可能?)你想要:

Buffer.BlockCopy(buffer, offst, allData, 0, fileSize);

您在buffer[]中收到一大块字节,并将其复制到局部变量中。您正在复制一个名为allData的本地变量中的字节,该变量每次都是新创建的。

您也应该将接收器缓冲区allData传递给函数。